归并排序及其复杂度分析

/*
* (二分)归并排序(稳定算法)
* 基本思想:将数组递归分成越来越小的数集,直到每个数集只有一个数
* 然后将数据递归排序,使其合并成与原来数据一样的有序序列
* 时间复杂度分析:递归分解数据,需要递归logN次,每次都需要对n个数据扫描一次,最好最坏平均都一样,所以O(nlogn)
* 空间复杂度分析:归并排序需要一个临时temp[]来储存归并的结果,所以   O(n) 

* 基本实现:需要两个函数,一个用来递归划分数组,比较简单,依次二分即可
* 一个用来把划分好的数组递归排序并合并:两个数组从第一个元素开始比较,小的数据入,直到一个数组中数据为空,
* 然后把另一个数组中的剩余数据写入,最后用temp数组替代初始的数组
*/
 

  public void merge(int[] a, int start, int mid, int end) {
        int[] temp = new int[end - start + 1];
        int i = start;
        int j = mid + 1;
        int k = 0;
        while (i <= mid && j <= end) {
            if (a[i] < a[j]) {
                temp[k++] = a[i++];
            } else {
                temp[k++] = a[j++];
            }
        }
        while (i <= mid) {
            temp[k++] = a[i++];
        }
        while (j <= end) {
            temp[k++] = a[j++];
        }
        for (int m = 0; m < temp.length; ++m) {
            a[start + m] = temp[m];
        }

    }

    /**
     * @param a
     * @param start  数组索引
     * @param end    数组索引,<.length
     */
    public void mergeSort(int a[], int start, int end) {
        int mid = (end + start) / 2;
        if (start < end) {
            mergeSort(a, start, mid);
            mergeSort(a, mid + 1, end);
            merge(a, start, mid, end);
        }

    }

Ps:博文为博主的学习笔记,算法只是按照自己的理解简单分析,初学者建议看详细的图文讲解,如果有错误,欢迎交流指正

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值