快速排序(lomuto 和 Hoare)
阿新 • • 發佈:2021-10-08
- lomuto。易於理解
- Hoare。比較繞,效率比 lomuto 高。
lomuto
static void quickSort(int[] nums, int left, int right) { // base case if (left >= right) return; // partition int pivot = nums[left]; // 軸心值 int lBound = left; // 指向小堆最後一個元素,等於 left 說明小堆為空 int rBound = left + 1; // rBound 作為探子探索“亂堆” while (rBound <= right) { if (nums[rBound] >= pivot) { // 找到大元素,放入大堆 rBound++; } else { // 找到小元素,放入小堆(將該元素與大堆第一個元素進行交換) swap(nums, ++lBound, rBound++); } } swap(nums, left, lBound); // 將小堆最後一個元素與 pivot 交換 // System.out.println("[" + left + ", " + right + "] " + Arrays.toString(nums)); // recursion quickSort(nums, left, lBound); quickSort(nums, lBound + 1, right); }
Hoare
static void process(int[] nums, int left, int right) { if (left >= right) return; int pivot = nums[right]; // 右邊界上的值作為“軸心” int i = left, j = right - 1; while (true) { while (i < right && nums[i] <= pivot) i++; while (left <= j && nums[j] > pivot) j--; if (i > j) break; swap(nums, i, j); } swap(nums, i, right); process(nums, left, i - 1); process(nums, i, right); }