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

归并排序

-自然语言描述:

指的是将两个已经排序的序列合并成一个序列的操作。

归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。

-原地归并的抽象方法:

public static void merge(Comparable[] a, int start, int mid, int end){
  //将a[start..mid]和a[mid +1...end]归并
  int i = star,  j= mid + 1;
  for(int k = start; k<=end; k++)  //将a[start...end]复制到aux[start...end]
      aux[k] = a[k];

  for (int k = start; k<=end; k++)
    if (i > mid)                           a[k] = aux[j++];
    else if (j > end)                   a[k] = aux[i++];
    else if (less(aux[j], aux[i]))  a[k] = aux[j++];
    else                                     a[k] = aux[i++];
}
轨迹图

-自顶向下的归并排序:

public class Merge {

  private static Comparable[] aux;             // 归并所需的辅助数组

  public static void sort(Comparable[] a){        // 一次性分配空间
    aux = new Comparable[a.length];
    sort(a, 0, a.length - 1);
  }

  private static void sort(Comparable[] a, int start, int end){
    if (end <= start) return;
    int mid = start + (end - start)/2;            
    sort(a, start, mid);                                //将左半边排序
    sort(a, mid+1, end);                             //将右半边排序
    merge(a, start, mid, end);                    //原地归并的抽象方法
  }
}
自顶向下的归并排序的轨迹
调用轨迹

这两张图我也是想了好久才看懂一些,建议可以在纸上用二叉树画出来,会清晰很多。

-自底向上的归并排序

public class MergeBU {
  private static Comparable[] aux;                  //归并辅助函数
  
  public static void sort(Comparable[] a){
    int N = a.length;
    aux = new Comparable[N];
    for (int sz = 1; sz < N; sz = sz + sz)
        for (int lo = 0; lo < N - sz; lo += sz + sz)
            merge(a, lo, lo + sz - 1,Math.min(lo + sz + sz - 1,N - 1));
  }
}
自底向上的归并排序
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,355评论 0 2
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,303评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,829评论 0 15
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,519评论 0 1
  • UML类图 关系1: 继承关系、 一般使用extends关键字 、A extends B 表示A继承B的一些属性方...
    Sunny_一一阅读 544评论 1 1

友情链接更多精彩内容