数据结构与算法四:归并排序

来源:互联网 发布:json lib apache 编辑:程序博客网 时间:2024/06/05 16:06

一、归并排序定义

递归的将一个数组分成两半分别排序,然后将结果归并起来。

二、归并排序性质

1、排序时间:对于任意长度为N的数组,自顶向下的归并排序需要1/2NlgN至NlgN次比较

2、需要额外的空间和N成正比


三、代码实现

public class MergeAlg {private static Comparable[] aux;public static boolean less(Comparable a, Comparable b){return a.compareTo(b) < 0;}public static void sort(Comparable[] a){int N = a.length;aux = new Comparable[N];sort(a,0,N-1);}/** * 自顶向下排序 */public static void sort(Comparable[] a, int lo, int hi){if(lo == hi) return;int mid = lo + (hi - lo) / 2;sort(a,lo,mid);sort(a,mid + 1,hi);merge(a, 0, mid, hi);}/** * 自下向上 */public static void sortUp(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 = lo + sz + sz){merge(a, lo, lo + sz - 1, Math.min(lo + sz + sz - 1, N - 1));}}}public static void merge(Comparable[] a, int lo, int mid, int hi){int i = lo, j = mid + 1;for(int t = lo; t <= hi; t++){aux[t] = a[t];}for(int t = lo; t <= hi; t++){if(i > mid) a[t] = aux[j++];else if(j > hi) a[t] = aux[i++];else if(less(aux[i], aux[j])) a[t] = aux[i++];else a[t] = aux[j++];}}}

四、核心步骤图