voidQuickSort(int arr[], int low, int high) { if (low < high) { int pivot = arr[low]; int i = low, j = high; while (i < j) { while (i < j && arr[j] >= pivot) j--; if (i < j) { arr[i++] = arr[j]; } while (i < j && arr[i] < pivot) i++; if (i < j) { arr[j--] = arr[i]; } } arr[i] = pivot; QuickSort(arr, low, i - 1); QuickSort(arr, i + 1, high); } }
voidMerge(int arr[], int tmp[], int low, int mid, int high) { for (int i = low; i <= high; i++) { tmp[i] = arr[i]; } int i = low, left = low, right = mid + 1; while (left <= mid && right <= high) { arr[i++] = tmp[left] < tmp[right] ? tmp[left++] : tmp[right++]; } while (left <= mid) { arr[i++] = tmp[left++]; } while (right <= high) { arr[i++] = tmp[right++]; } }
voidMergeSort(int arr[], int tmp[], int low, int high) { if (low < high) { int mid = low + ((high - low) >> 1); MergeSort(arr, tmp, low, mid); // 排左半部分(注意细节:左半部分上界不是mid-1,不然无穷递归!) MergeSort(arr, tmp, mid + 1, high); // 排右半部分 Merge(arr, tmp, low, mid, high); // 合并 } }
voidMergeSort(int arr[], int n) { int* const tmp = newint[n]; MergeSort(arr, tmp, 0, n - 1); delete[] tmp; }
优化
如果用自底向上的方法,可以将归并排序改成迭代版本的
1 2 3 4 5 6 7 8 9 10 11 12
voidMergeSort(int arr[], int n) { int* tmp = newint[n]; for (int gap = 1; gap < n; gap <<= 1) { for (int low = 0; low < n; low += (gap << 1)) { int high = low + (gap << 1) - 1; int mid = (low + high) >> 1; Merge(arr, tmp, low, mid >= n ? n - 1 : mid, high >= n ? n - 1 : high); } } delete[] tmp; }