归并排序
算法思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and
Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使
子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
过程演示
代码实现
class Solution {
public int[] sortArray(int[] nums) {
sort(nums,0,nums.length-1);
return nums;
}
public static void sort(int[] array, int left, int right){
if(left == right){
return;
}
//拆分数组
int mid = (left+right)/2;
sort(array,mid+1,right);
sort(array,left,mid);
//合并数组
merge(array,left,mid,right);
}
public static void merge(int[] array, int left, int mid, int right){
int[] temp = new int[right-left+1];
for (int i=0,j=left,k=mid+1; i < temp.length; i++) {
//如果j大于mid说明左边这段数组的元素放完了,把右边剩余的数组元素放进去就好了
if(j > mid){
temp[i] = array[k++];
}
//如果k大于right说明右边这段数组的元素放完了,把左边剩余的数组元素放进去就好了
else if(k > right){
temp[i] = array[j++];
}
else {
//将两个数组段合并,小的往前放
temp[i] = ( array[j] > array[k]) ? array[k++] : array[j++];
}
}
///把临时数组中排好序的元素放进array数组
for (int i=left,j=0; i <= right; i++) {
array[i] = temp[j++];
}
}
}
性能分析
稳定性 :稳定
相关问题
海量数据的排序问题
外部排序:排序过程需要在磁盘等外部存储进行的排序
前提:内存只有 1G,需要排序的数据有 100G
因为内存中因为无法把所有数据全部放下,所以需要外部排序,而归并排序是最常用的外部排序
- 先把文件切分成 200 份,每个 512 M
- 分别对 512 M 排序,因为内存已经可以放的下,所以任意排序方式都可以
- 进行 200 路归并,同时对 200 份有序文件做归并过程,最终结
快速排序和归并排序的异同?
相同点:
- 两者都用到了分治思想
- 都是不稳定的算法
不同点:
- 快速排序是先排序再递归,归并排序是先递归再排序
- 快排的平均复杂度是nlogn,最坏会达到n平方的复杂度。
- 归并排序复杂度最好,最坏,平均都是nlogn。是严格的nlogn复杂度。
总结