[問題] Wiki 的合併排序法

作者: obelisk0114 (追風箏的孩子)   2016-12-16 07:38:56
這個連結是中文維基百科的合併排序法
https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
在 java 的疊代版程式如下
public static void merge_sort(int[] arr) {
int len = arr.length;
int[] result = new int[len];
int block, start;
// 原版代码的迭代次数少了一次,没有考虑到奇数列数组的情况
for(block = 1; block < len*2; block *= 2) {
for(start = 0; start <len; start += 2 * block) {
int low = start;
int mid = (start + block) < len ? (start + block) : len;
int high = (start + 2 * block) < len ? (start + 2 * block) : len;
//两个块的起始下标及结束下标
int start1 = low, end1 = mid;
int start2 = mid, end2 = high;
//开始对两个block进行归并排序
while (start1 < end1 && start2 < end2) {
result[low++] = arr[start1] < arr[start2] ? arr[start1++] :
arr[start2++];
}
while(start1 < end1) {
result[low++] = arr[start1++];
}
while(start2 < end2) {
result[low++] = arr[start2++];
}
}
int[] temp = arr;
arr = result;
result = temp;
}
result = arr;
}
作者: ssccg (23)   2016-12-16 09:11:00
3當然比較快啊,每次loop少copy整個array一次loop裡都是從來源arr到目標result,做完一次當然要把來源改成指向這輪的結果(arr=result),至於result=temp(arr)只是重新利用現有空間而已另外這不是淺層複製,根本沒有複製,是交換指向的array物件1沒錯到block < len就可2 當然還是要判斷只是不用多做只剩一個block直接break就好當然會錯誤啊,不利用現有空間不是不用做事是要像一開始那樣result = new int[len];然後你的等於大於len我看不懂你是要說什麼...我是說start + block < len這判斷一定要做,當這條件不成立(start + block >= len)時,代表這輪的兩個block中後面那個沒有了,只有一個block,至於是>還是=是差在前面那個block大小是不是剛好等於這輪的block,跟要不要這判斷沒關係舉例來說block = 2, start = 4, len = 5至少要加 if (mid >= len) break;
作者: obelisk0114 (追風箏的孩子)   2016-12-16 19:02:00
了解了, Thanks

Links booklink

Contact Us: admin [ a t ] ucptt.com