《算法(第四版)》排序-----归并排序

本文详细介绍了归并排序的原理和两种实现方式——自下而上和自上而下。归并排序的时间复杂度为O(NlogN),需要额外的内存空间。自下而上的归并排序通过逐步合并子数组实现,适合链表数据;自上而下则是通过递归分解数组并合并。归并排序是稳定的排序算法。
摘要由CSDN通过智能技术生成

参考文章的地址:http://www.cnblogs.com/skywang12345/p/3602369.html

归并排序基本原理是将两个有序的数组,在合并的过程中进行排序成一个更大的有序数组。

归并排序的时间复杂度为NlogN,缺点是需要额外的内存空间


归并排序的实现方法是:创建一个适当大小的数组然后将两个输入数组中的元素一个个从小到大的放入这个数组中。


将两个数组抽象化的归并方法如下:

方法名为merge(a,lo,mid,hi),它会将子数组a[lo...mid]  a[mid+1...hi]归并成一个有序的数组并将结果存放在a[lo...hi]中,

public static void merge(Comparable[] a, int lo, int mid, int hi){
//将a[lo...mid]  和a[mid+1...hi]归并
    int i = lo;   // 第一个有序区域的索引 
    int j = mid +1;  //第二个有序区域的索引
    
    for(int k = lo; k <= hi; k++){//将a[lo...hi]复制到aux[lo...hi]中,这样在操作a[]是数据不会被覆盖而丢
        aux[k] = a[k];            //aux[]   是在类中建立的一个辅助数组,它的大小和a[]的大小一样大
    }
    
    for(int k = lo; k <=hi; k++){  //归并到a[lo...hi]中
        if(i > mid){            //左半边用尽,也就是当第一个有序数组的所有数据都放入到归并的数组中了,由于上一次结果会i++,
                                //所以会进入到这个条件中,那就直接把右边的往归并数组里扔就可以了
            a[k] = aux[j++];
        }else if(j > hi){       //同上,当右半边数据(第二个有序区域)都放入到归并的数组中了,那就直接吧剩下的左边数据(第一个有序数组)放入归并数组
            a[k] = aux[i++];
        }else if(less(aux[j], aux[i])){//这句话才是归并在比较大小的那句,谁小谁放入数组中
            a[k] = aux[j++];
        }else{
            a[k] = aux[i++];
        }
    }
}


归并排序一共有两种方法,一种是自上而下的归并排序,一种是自下而上的归并排序

(1)自下而上的归并排序

所谓的自下而上排序分为三个步骤

1.分解:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;

2.合并:得到若干个长度为2的有序数列,再将这些数列两两合并;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值