// Hover intPartition_1(intarray[], int left, int right){ int begin = left; // [left, begin] 保证 <= pivot int end = right - 1; // [end, right] 保证 >= pivot int pivot = array[right]; // 基准值 while (begin < end) { while (begin < end && array[begin] <= pivot) { begin++; } while (begin < end && array[end] >= pivot) { end--; } swap(array[begin], array[end]); } // 把基准值和begin所在的下标交换,和第一个比pivot大的数交换 swap(array[begin], array[right]); return begin; }
// 挖坑 intPartition_2(intarray[], int left, int right){ int begin = left; // [left, begin] 保证 <= pivot int end = right; // [end, right] 保证 >= pivot int pivot = array[right]; // 基准值 while (begin < end) { while (begin < end && array[begin] <= pivot) { begin++; } array[end] = array[begin]; while (begin < end && array[end] >= pivot) { end--; } array[begin] = array[end]; } array[begin] = pivot; return begin; }
// 前后下标 intPartition_3(intarray[], int left, int right){ int d = left; for (int i = left; i < right; i++) { if (array[i] < array[right]) { swap(array[i], array[d]); d++; } } swap(array[d], array[right]); return d; }
voidQuickSortInner(intarray[], int left, int right){ if (left >= right) { // size <= 1 return; } // 1. 确定基准值 // 2. 遍历区间,进行切割,直到小的全在左,大的全在右,并且返回最终基准值所在的下标 int d = Partition_1(array, left, right); // [left, right] 的区间被分成三部分 // [left, d - 1] <= pivot // [d] == pivot // [d + 1, right] >= pivot // 3. 分治处理所有两个小区间 QuickSortInner(array, left, d - 1); QuickSortInner(array, d + 1, right); }
voidQuickSort(intarray[], int size){ QuickSortInner(array, 0, size - 1); }
voidQuickSortNoR(intarray[], int size){ // 保存要排序区间的左右边界 std::stack<int> stack; stack.push(size - 1); // right stack.push(0); // left while (!stack.empty()) { int left = stack.top(); stack.pop(); int right = stack.top(); stack.pop(); if (left >= right) { continue; } int d = Partition_1(array, left, right); // [d + 1, right] stack.push(right); stack.push(d + 1); // [left, d - 1] stack.push(d - 1); stack.push(left); } }