Java 合并排序与插入排序
我在中实现了一个合并排序。 我的基本合并排序工作正常,我想通过在数组大小小于7时使用插入排序来改进算法。 我认为这显然是一个有效的改进,但实际上,对于大数据,原始的改进比改进的更快 这是我改进的合并排序,CUTOFF=7:Java 合并排序与插入排序,java,algorithm,mergesort,Java,Algorithm,Mergesort,我在中实现了一个合并排序。 我的基本合并排序工作正常,我想通过在数组大小小于7时使用插入排序来改进算法。 我认为这显然是一个有效的改进,但实际上,对于大数据,原始的改进比改进的更快 这是我改进的合并排序,CUTOFF=7: private static void merge(Comparable[] a, Comparable[] aux, int lo, int mid, int hi) { // Copy to aux[] for (int i = lo; i <= hi;
private static void merge(Comparable[] a, Comparable[] aux, int lo, int mid, int hi) {
// Copy to aux[]
for (int i = lo; i <= hi; i++) {
aux[i] = a[i];
}
// Merge back to a[]
int i = lo, j = mid + 1;
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++];
}
}
private static void sort(Comparable[] a, Comparable[] aux, int lo, int hi) {
// #1 improvement
// Stop condition for this recursion.
// This time we add a CUTOFF, when the items in array
// is less than 7, we will use insertion sort.
if (hi <= lo + CUTOFF - 1) {
Insertion.sort(a, lo, hi);
return;
}
int mid = lo + (hi - lo) / 2;
sort(a, aux, lo, mid);
sort(a, aux, mid + 1, hi);
if (!less(a[mid+1], a[mid])) return;
merge(a, aux, lo, mid, hi);
}
public static void sort(Comparable[] a) {
Comparable[] aux = new Comparable[a.length];
sort(a, aux, 0, a.length - 1);
}
私有静态无效合并(可比[]a、可比[]aux、int lo、int mid、int hi){
//复制到aux[]
对于(int i=lo;i hi)a[k]=aux[i++];
如果(小于(aux[i],aux[j])a[k]=aux[i++];
否则a[k]=aux[j++];
}
}
专用静态无效排序(可比[]a、可比[]aux、整数lo、整数hi){
//#1改进
//此递归的停止条件。
//这一次,当数组中的项
//小于7,我们将使用插入排序。
如果(hi你的插入排序函数肯定是错误的。注意j>0
结束条件。你传入[lo..hi]
,但是你的代码可以迭代j
一直到1
。我想你想要的是:
public static void sort(Comparable[] a, int lo, int hi) {
for (int i = lo + 1; i <= hi; i++) {
for (int j = i; j > lo && less(a[j], a[j - 1]); j--) {
exch(a, j, j - 1);
}
}
}
公共静态无效排序(可比[]a,int-lo,int-hi){
对于(int i=lo+1;i lo&&less(a[j],a[j-1]);j--){
exch(a,j,j-1);
}
}
}
有趣的是,如果你不想问任何问题,那就去做吧,因为你还没有问任何问题。java中不是也有同样的算法吗?哦,这肯定是问题所在。我忘了检查这个。谢谢!
public class SortCompare {
public static double time(String alg, Comparable[] a) {
Stopwatch timer = new Stopwatch();
if (alg.equals("Insertion")) Insertion.sort(a);
if (alg.equals("Selection")) Selection.sort(a);
if (alg.equals("Shell")) Shell.sort(a);
if (alg.equals("Merge")) Merge.sort(a);
if (alg.equals("MergeWithImprovements")) MergeWithImprovements.sort(a);
//if (alg.equals("Quick")) Quick.sort(a);
//if (alg.equals("Heap")) Heap.sort(a);
if (alg.equals("InsertionWithSentinel")) InsertionWithSentinel.sort(a);
return timer.elapsedTime();
}
public static double timeRandomInput(String alg, int N, int T) {
// Use alg to sort T random arrays of length N.
double total = 0.0;
Double[] a = new Double[N];
for (int t = 0; t < T; t++) {
for (int i = 0; i < N; i++) {
a[i] = StdRandom.uniform();
}
total += time(alg, a);
}
return total;
}
public static void main(String[] args) {
String alg1 = args[0];
String alg2 = args[1];
int N = Integer.parseInt(args[2]);
int T = Integer.parseInt(args[3]);
double t1 = timeRandomInput(alg1, N, T); // Total for alg1
double t2 = timeRandomInput(alg2, N, T);
StdOut.printf("For %d random Doubles\n %s is", N, alg1);
StdOut.printf(" %.1f times faster than %s\n", t2/t1, alg2);
}
}
public static void sort(Comparable[] a, int lo, int hi) {
for (int i = lo + 1; i <= hi; i++) {
for (int j = i; j > lo && less(a[j], a[j - 1]); j--) {
exch(a, j, j - 1);
}
}
}