Java排序之归并排序及排序算法总结

归并排序

算法思想: 归并排序(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
因为内存中因为无法把所有数据全部放下,所以需要外部排序,而归并排序是最常用的外部排序

  1. 先把文件切分成 200 份,每个 512 M
  2. 分别对 512 M 排序,因为内存已经可以放的下,所以任意排序方式都可以
  3. 进行 200 路归并,同时对 200 份有序文件做归并过程,最终结

快速排序和归并排序的异同?
相同点:

  • 两者都用到了分治思想
  • 都是不稳定的算法

不同点:

  • 快速排序是先排序再递归,归并排序是先递归再排序
  • 快排的平均复杂度是nlogn,最坏会达到n平方的复杂度。
  • 归并排序复杂度最好,最坏,平均都是nlogn。是严格的nlogn复杂度。

总结

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值