算法第四版 第二章 归并排序

4 篇文章 0 订阅

4 归并排序 merge sort

4.1 原理

需要将一个数组排序, 可以先 (递归地) 将它分成两半分别排序, 然后将结果归并起来.

4.1.1 优点

能够保证将任意长度 N N N 的数组排序所需时间和 N log ⁡ N N\log N NlogN 成正比.

4.1.2 缺点

所需的额外空间和 N N N 成正比.

4.2 归并实现

public static void merge(Comparable[] a, int lo, int mid, int hi) {
  int i=lo, j = mid+1;
  for (int k=0; k<=hi; k++) { aux[k] = a[k]; }
  for (int k=0; k<=hi; k++) {
    if (i>mid) 											{ a[k] = aux[j++]; }
    else if (j>hi) 									{ a[k] = aux[i++]; }
    else if (less(aux[i], aux[j])) 	{ a[k] = aux[i++]; }
    else 														{ a[k] = aux[j++]; }
  }
}

4.3 自顶向下的归并排序

4.3.1 实现
public class Merge {
  private static Comparable[] aux;
  
  public static void sort(Comparable[] a) {
    aux = new Comparable[a.length];
    sort(a, 0, a.length-1);
  }
  
  public static void sort(Comparable[] a, lo, hi) {
    if (lo >= hi) { return; }
    int mid = lo + (hi - lo)/2;
    sort(a, lo, mid);
    sort(a, mid+1, hi);
    merge(a. lo, mid, hi);
  }
}

4.3.2 性能分析

比较次数: N log ⁡ N N\log N NlogN.

4.4 自底向上的归并排序

4.4.1 实现
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));
      }
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值