Quick Sort
快速排序的核心思想在于:每次把选定的基准数(这里我们默认为每部分的最后一个元素)归位,即把大于它的数都放在其右边,小于它的数都放在其左边。每次递归只归位一个数,直到只剩下一个数。
快排的算法原理不难,但文字是枯燥的。相信聪明的读者在了解上述核心思想之后可以从代码中深刻体会其算法细节。
函数主体
void quickSort(vector<int>& A, int begin, int end) {
if (end <= begin) // 此处为左闭右开区间,(],即排序下标范围为 begin,end-1
return;
int div = partition(A, begin, end); // 找到分界点,这一句执行完成后待排序数组已经完成了一次归位
quickSort(A, begin, div); // 递归分别完成左右两部分的归位
quickSort(A, div + 1, end);
}
Partition函数(执行归位的主体)
Partition函数的作用是把传进来的数组片段进行一次归位,具体地说,把 A[end-1] 归位。(归位的意思已经在本文开头的地方解释)
int partition(vector<int>& A, int begin, int end) {
int pivot = A[end - 1]; // 本轮需要归位的元素,我们已经规定为这段数组的最后一个数了
int i = begin;
for (int j = begin; j < end; j++) {
if (A[j] < pivot) {
swap(A[i], A[j]);
i++;
}
}
swap(A[end - 1], A[i]);
return i;
}
测试
int main() {
vector<int> nums = {7, 7, 5, 8, 2, 5, 8, 5, 2, 7};
quickSort(nums, 0, nums.size());
for (int i : nums)
cout << i << endl;
system("pause");
}