归并排序 递归
This commit is contained in:
parent
daf5e589ac
commit
20bb195d92
|
|
@ -1,11 +1,11 @@
|
|||
package bitoperation;
|
||||
package algorithm.bitoperation;
|
||||
|
||||
/**
|
||||
* 二进制中1的个数
|
||||
* @author Wen
|
||||
* @date 2021/12/29 22:53
|
||||
*/
|
||||
public class OneCount {
|
||||
public class FindOneCount {
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(findOneCount(7));
|
||||
|
|
@ -1,6 +1,4 @@
|
|||
package sort;
|
||||
|
||||
import javax.sound.midi.Soundbank;
|
||||
package algorithm.sort;
|
||||
|
||||
/**
|
||||
* 冒泡排序
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package sort;
|
||||
package algorithm.sort;
|
||||
|
||||
/**
|
||||
* 堆排序
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package sort;
|
||||
package algorithm.sort;
|
||||
|
||||
/**
|
||||
* 插入排序
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
package algorithm.sort;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 归并排序
|
||||
*
|
||||
* @param <T>
|
||||
*/
|
||||
public class MergeSort<T extends Comparable<T>> extends Sort<T> {
|
||||
@Override
|
||||
public void sort(T[] nums) {
|
||||
int l = 0, r = nums.length - 1;
|
||||
merge(nums, l, r);
|
||||
}
|
||||
|
||||
private void merge(T[] nums, int l, int r) {
|
||||
if (l == r) {
|
||||
return;
|
||||
}
|
||||
int mid = l + ((r - l) >> 1);
|
||||
int left = l;
|
||||
int right = mid + 1;
|
||||
merge(nums, l, mid);
|
||||
merge(nums, mid + 1, r);
|
||||
List<T> temp = new ArrayList<>(r - l + 1);
|
||||
while (left <= mid && right <= r) {
|
||||
if (less(nums[left], nums[right])) {
|
||||
temp.add(nums[left++]);
|
||||
// temp[index++] = nums[left++];
|
||||
} else {
|
||||
// temp[index++] = nums[right++];
|
||||
temp.add(nums[right++]);
|
||||
}
|
||||
}
|
||||
while (left <= mid) {
|
||||
temp.add(nums[left++]);
|
||||
}
|
||||
while (right <= r) {
|
||||
temp.add(nums[right++]);
|
||||
}
|
||||
for (int i = 0; i < temp.size(); i++) {
|
||||
nums[l + i] = temp.get(i);
|
||||
}
|
||||
}
|
||||
// @Override
|
||||
// public void sort(T[] nums) {
|
||||
// int length = nums.length;
|
||||
// T[] tempArr = (T[]) new Comparable[length];
|
||||
// //合并的个体数组大小
|
||||
// int mergeNum = 1;
|
||||
// while (mergeNum <= length){
|
||||
// int startSubscript = 0;
|
||||
// for (int i = 0;i < length;i++){
|
||||
// tempArr[i] = nums[i];
|
||||
// }
|
||||
// while ((startSubscript + 1) * mergeNum < length){
|
||||
// //第一组初始下标
|
||||
// int leftSub = startSubscript * mergeNum;
|
||||
// //第二组初始下标
|
||||
// int rightSub = (startSubscript + 1) * mergeNum;
|
||||
// //左数组长度
|
||||
// int leftArrLen = mergeNum;
|
||||
// //右数据长度
|
||||
// int rightArrLen = (length - rightSub) > mergeNum ? mergeNum : (length - rightSub);
|
||||
// int leftEnd = leftSub + leftArrLen;
|
||||
// int rightEnd = rightSub + rightArrLen;
|
||||
// int count = leftSub;
|
||||
// for (;rightSub < rightEnd || leftSub < leftEnd;){
|
||||
// if (leftSub == leftEnd){
|
||||
// nums[count++] = tempArr[rightSub++];
|
||||
// }else if (rightSub == rightEnd) {
|
||||
// nums[count++] = tempArr[leftSub++];
|
||||
// }else if (less(tempArr[leftSub], tempArr[rightSub])){
|
||||
// nums[count++] = tempArr[leftSub++];
|
||||
// }else{
|
||||
// nums[count++] = tempArr[rightSub++];
|
||||
// }
|
||||
// }
|
||||
// startSubscript = startSubscript + 2;
|
||||
// }
|
||||
// mergeNum = mergeNum * 2;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package sort;
|
||||
package algorithm.sort;
|
||||
|
||||
/**
|
||||
* 快速排序
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package sort;
|
||||
package algorithm.sort;
|
||||
|
||||
/**
|
||||
* 选择排序
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package sort;
|
||||
package algorithm.sort;
|
||||
|
||||
/**
|
||||
* 希尔排序
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package sort;
|
||||
package algorithm.sort;
|
||||
|
||||
public abstract class Sort<T extends Comparable<T>> {
|
||||
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package algorithm.sort;
|
||||
|
||||
/**
|
||||
* @author Wen
|
||||
* @date 2022/8/7 15:39
|
||||
*/
|
||||
public class SortTest {
|
||||
public static void main(String[] args) {
|
||||
Integer[] source = new Integer[]{2,1,3,64,7,3,1,3,24,5,3,6,7,9,3,24};
|
||||
MergeSort<Integer> mergeSort = new MergeSort<>();
|
||||
mergeSort.sort(source);
|
||||
for (int i : source) {
|
||||
System.out.println(i + ",");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package linklist;
|
||||
package ds.linklist;
|
||||
|
||||
/**
|
||||
* @author Wen
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package linklist;
|
||||
package ds.linklist;
|
||||
|
||||
/**
|
||||
* @author Wen
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package linklist;
|
||||
package ds.linklist;
|
||||
|
||||
/**
|
||||
* @author Wen
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
package queue;
|
||||
package ds.queue;
|
||||
|
||||
import linklist.DoubleNode;
|
||||
import ds.linklist.DoubleNode;
|
||||
|
||||
/**
|
||||
* @author Wen
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
package sort;
|
||||
|
||||
/**
|
||||
* 归并排序
|
||||
* @param <T>
|
||||
*/
|
||||
public class MergeSort<T extends Comparable<T>> extends Sort<T> {
|
||||
@Override
|
||||
public void sort(T[] nums) {
|
||||
int length = nums.length;
|
||||
T[] tempArr = (T[]) new Comparable[length];
|
||||
//合并的个体数组大小
|
||||
int mergeNum = 1;
|
||||
while (mergeNum <= length){
|
||||
int startSubscript = 0;
|
||||
for (int i = 0;i < length;i++){
|
||||
tempArr[i] = nums[i];
|
||||
}
|
||||
while ((startSubscript + 1) * mergeNum < length){
|
||||
//第一组初始下标
|
||||
int leftSub = startSubscript * mergeNum;
|
||||
//第二组初始下标
|
||||
int rightSub = (startSubscript + 1) * mergeNum;
|
||||
//左数组长度
|
||||
int leftArrLen = mergeNum;
|
||||
//右数据长度
|
||||
int rightArrLen = (length - rightSub) > mergeNum ? mergeNum : (length - rightSub);
|
||||
int leftEnd = leftSub + leftArrLen;
|
||||
int rightEnd = rightSub + rightArrLen;
|
||||
int count = leftSub;
|
||||
for (;rightSub < rightEnd || leftSub < leftEnd;){
|
||||
if (leftSub == leftEnd){
|
||||
nums[count++] = tempArr[rightSub++];
|
||||
}else if (rightSub == rightEnd) {
|
||||
nums[count++] = tempArr[leftSub++];
|
||||
}else if (less(tempArr[leftSub], tempArr[rightSub])){
|
||||
nums[count++] = tempArr[leftSub++];
|
||||
}else{
|
||||
nums[count++] = tempArr[rightSub++];
|
||||
}
|
||||
}
|
||||
startSubscript = startSubscript + 2;
|
||||
}
|
||||
mergeNum = mergeNum * 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue