参考:Java实现归并排序
算法介绍
归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。
基本思想
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

合并相邻子序列
再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8]


实现代码
public static void main(String[] args) {
int[] nums = new int[]{9,8,5,6,3,2,1,4,7,0};
mergeSort(0,nums.length - 1,nums,new int[nums.length]);
System.out.println(Arrays.toString(nums));
}
// 分
public static void mergeSort(int l,int r,int[] arr,int[] temp){
if (l < r){
int mid = (l + r) >> 1;
// 分左
mergeSort(l,mid,arr,temp);
// 分右
mergeSort(mid + 1,r,arr,temp);
// 合并
sort(l,r,mid,arr,temp);
}
}
// 合
static void sort(int l,int r,int mid,int[] arr,int[] temp){
int i = l;
int j = mid + 1;
int index = 0;
while (i <= mid && j <= r){
if (arr[i] < arr[j]){
temp[index++] = arr[i++];
}else {
temp[index++] = arr[j++];
}
}
// 左边多了
while (i <= mid){
temp[index++] = arr[i++];
}
// 右边多了
while (j <= r){
temp[index++] = arr[j++];
}
int tl = l;
index = 0;
while (tl <= r){
arr[tl++] = temp[index++];
}
}


12万+

被折叠的 条评论
为什么被折叠?



