***
*
* @author xiaoo_gan
* 归并排序算法
* 实现思想:
* 要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。
*
* 它能将任意长度为N地数组排序所需时间和NlogN成正比。
* 能处理数百万甚至更大规模的数组,这是插入排序或选择排序做不到的。
* 缺点:所需地额外空间和N成正比。
*
* 测试:
* 排序 20000000 个数,归并排序用时: 14.57500 秒
*/
public class Merge {
private static Comparable[] aux;
public static void sort(Comparable[] a) {
aux = new Comparable[a.length];
sort(a, 0, a.length - 1);
assert isSorted(a);
}
//自顶向下的归并排序
//需要比较次数 (0.5*N*lgN < n < N*lgN)
//对于长度为N的任意数组,自顶向下的归并排序最多需要访问数组 6N*lgN 次
public static void sort(Comparable[] a, int lo, int hi) {
if (hi <= lo) {
return;
}
int mid = lo + (hi - lo) / 2;
sort(a, lo, mid);
sort(a, mid + 1, hi);
merge(a, lo, mid, hi);
//System.out.printf("merge(a, %d, %d, %d)\n", lo, mid, hi);
}
public static void merge(Comparable[] a, int lo, int mid, int hi) {
int i = lo;
int j = mid + 1;
for (int k = lo; k <= hi; k++) {
aux[k] = a[k];
}
for (int k = lo; 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++];
}
}
public static boolean isSorted(Comparable[] a) {
for (int i = 0; i < a.length - 1; i++) {
if(!less(a[i], a[i+1]))
return false;
}
return true;
}
private static boolean less(Comparable a, Comparable b) {
return (a.compareTo(b) < 0);
}
public static void main(String[] args) {
// String s = "MERGESORTEXAMPLE";
// int N = s.length();
// String[] a = new String[N];
// for (int i = 0; i < N; i++) {
// a[i] = s.substring(i, i+1);
// }
// sort(a);
int M = 200000;
Double[] b = new Double[M];
Double[] c = new Double[M];
for (int i = 0; i < M; i++) {
b[i] = StdRandom.uniform();
c[i] = b[i];
}
Stopwatch timer1 = new Stopwatch();
sort(b);
double elapsedTime1 = timer1.elapsedTime();
if(isSorted(b))
System.out.printf("排序 %d 个数,归并排序用时: %.5f 秒", M, elapsedTime1);
// Stopwatch timer2 = new Stopwatch();
// InsertionWithSentry.sort(c);
// double elapsedTime2 = timer2.elapsedTime();
//System.out.printf("排序 %d 个数,归并排序: %.5f 比带哨兵的插入排序: %.5f 快 %.5f 倍!", M, elapsedTime1, elapsedTime2 ,elapsedTime2/elapsedTime1);
}
}
[算法之排序]归并排序算法(java实现)
最新推荐文章于 2021-11-18 18:25:37 发布