思路
- 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
代码实现
public class MergeSort {
public static void main(String[] args) {
int[] array = { 8, 4, 5, 7, 1, 3, 6, 2 };;
int[] temp = new int[array.length] ;
mergeSort(array,0,array.length-1,temp);
for (int i : array) {
System.out.print(i+" ");
}
System.out.println();
}
private static void merge(int[] array,int left,int right,int mid,int[] temp){
int i = left; // 初始化 i, 左边有序序列的初始索引
int j = mid + 1; //初始化 j, 右边有序序列的初始索引
int t = 0; // 指向 temp 数组的当前索引
//先把左右两边(有序)的数据按照规则填充到 temp 数组
//直到左右两边的有序序列,有一边处理完毕为止
while (i <= mid && j <= right){
if (array[i] <= array[j]){
temp[t] = array[i];
t++;
i++;
}else {
temp[t] = array[j];
t++;
j++;
}
}
//有一边处理完毕,另一边全部放到temp里
while (i <= mid){
//右边处理完毕,把左边的剩余的都放入temp
temp[t] = array[i];
t++;
i++;
}
while (j <= right){
//左边处理完毕,把右边的剩余的都放入temp
temp[t] = array[j];
t++;
j++;
}
//最后把temp拷贝到array
t = 0;
int liftTemp = left;
while (liftTemp <= right){
array[liftTemp] = temp[t];
t++;
liftTemp++;
}
}
public static void mergeSort(int[] array,int left,int right,int[] temp){
// 结束条件
if (left >= right){
return;
}
int mid = (left+right) / 2;
// 向左边分
mergeSort(array,left,mid,temp);
// 向右边分
mergeSort(array,mid + 1,right,temp);
// 重新合并
merge(array,left,right,mid,temp);
}
}