关于合并排序算法的形式如下:当med从(ini + end)/ 2变为ini +(end-ini)/ 4时,Merge-Sort算法会发生什么?
public static void merge(int [] a, int ini, int med, int end){
int [] b = new int[end - ini + 1];
int i = ini;
int j = med + 1;
int k = 0;
while(i <= med && j <= end) {
if(a[i] <= a[j]){
b[k] = a[i];
i++;
}
else {
b[k] = a[j];
j++;
}
k++;
}
while(i <= med) {
b[k] = a[i];
i++;
k++;
}
while(j <= end) {
b[k] = a[j];
j++;
k++;
}
for(k = 0; k < b.length; k++){
a[ini + k] = b[k];
}
}
public static void mergeSortRec(int [] a, int ini, int end){
if(ini < end){
int med = (ini + end)/2;
mergeSortRec(a, ini, med);
mergeSortRec(a, med + 1, end);
merge(a, ini, med, end);
}
}
public static void mergeSort(int [] a){
mergeSortRec(a, 0, a.length - 1);
}
我必须确定哪些性能差异将到合并方法,如果我从(INI +端)/ 2改变内部mergeSortRec的配有可变制成到ini +(end-ini)/ 4。
我试着渐近评估算法,发现前者合并进入O(n),mergeSortRec进入O(ln n)(所以算法是O(n ln n),但是我无法评估它是如何站在新的窗体上。
是什么合并的方法性能上的差异时做出更改? 的算法作为一个整体,有没有真正的区别?
我试图看看哪一个会更有效率(我知道它可能是n/2)作为练习,但我无法评估它
'有没有真正的区别?' - 你似乎在一个有前途的轨道上 - 请说明你有多远评估算法“渐近地”和“作为练习”。 – greybeard