//將有序子序列合併成大序列 void mergeSub(int *a, int start, int middle,int end) { //申請輔助空間 int len = end - start + 1; int *b = new int[len]; int i = start; int j = middle + 1; int k = 0; while (i<=middle && j<=end) { b[k++] = a[i] < a[j] ? a[i++] : a[j++]; } while (i<=middle) { b[k++] = a[i++]; } while (j<=end) { b[k++] = a[j++]; } for (int i = 0; i < len;i++) { a[start++] = b[i]; } delete[]b; } //歸併排序--遞歸實現(自頂向下) void mergeSort(int *a, int start,int end) { int middle = (start + end) / 2; if (start==end) { return; } mergeSort(a, start, middle); mergeSort(a, middle + 1, end); mergeSub(a, start, middle, end); } //歸併排序--迭代實現(自底向上) void mergeSortIterator(int *a, int start, int end) { int length = 1; //子序列的長度 while (length<end) { int i = 0; for (;i+2*length-1<=end;i=i+2*length-1 ) { mergeSub(a, i, i + length - 1, i + 2 * length - 1); } if (i+length-1<end) { mergeSub(a, i, i + length - 1, end); } length *= 2; } }