8.快速排序
1 #include "pch.h"
2 #include <iostream>
3 // 该算法的思想是假设待排序序列设置为这样: pivot|L||R||比较序列|
4 // 每次pivot和比较序列(一般我们设数组首元素为pivot,则为数组第二个元素开始往后的序列)
5 // 我们记录了L的末元素end,这样每当我们需要将L扩增时,不必移动R,而是将R首元素(++end)与比较序列的元素交换
6 int Partition(int *arr,int lo,int hi) {
7 int pivot = arr[lo]; //实际上pivot应当具有随机性,使用rand()可随机设置序列中的元素作为pivot
8 int end = lo; //指示左序列的最后一个元素的秩
9 for (int k = lo + 1; k <= hi; k++) { //省略else分支
10 if (arr[k] < pivot) //如果中轴值比比较序列大,L右移,否则只需显式K++(R扩增)
11 std::swap(arr[++end], arr[k]);
12 }
13 std::swap(arr[lo], arr[end]); //记住,中轴值一开始位置从未变过,最后需要做一次交换
14 return end;
15 }
16 void quickSort(int *arr, int lo, int hi) {
17 if (lo<hi){
18 int mid = Partition(arr, lo, hi);
19 quickSort(arr,lo, mid);
20 quickSort(arr, mid + 1, hi);
21 }
22 }
23 int main() {
24 int a[8] = { 4,2,3,7,6,9,8,5 };
25 quickSort(a, 0,7);
26 for (int k = 0; k < 8; k++) {
27 std::cout << a[k] << " ";
28 }
29 }