一. 快速排序思路
1. 快速排序首先在所需要排序的数据中随机地选出一个数作为阀值,并把这个数(也就是这个阀值)与原来数据中最后的一个数交换,到了这步,数据中最后的一个数就是这个阀值了。
2. 然后从头开始,将数据一个一个地与这个阀值作比较,小于这个阀值的数,放在左边,等于这个阀值的数不用理,大于这个阀值的数放在右边,这样就可以将数据分成小于等于大于三个
区间了。注意每个区间里的数据是乱序的。
3. 最后从复步骤2(也就是递归)。
二. 程序
#include <iostream> #include <cstdio> #include <cstdlib> #include <time.h> #include <algorithm> using namespace std; void swap(int arr[], int i, int j) { //交换函数 int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } int* partition(int arr[], int l, int r) { //划分区间函数 int less = l - 1; int more = r; while (l < more) { if (arr[l] < arr[r]) { //小于阀值的区间 swap(arr, ++less, l++); } else if (arr[l] > arr[r]) { //大于阀值的区间 swap(arr, --more, l); } else { //等于阀值的区间 l++; } } swap(arr, more, r); return new int[]{less + 1, more}; } void quickSort(int arr[], int l, int r) { //快速排序函数 if (l < r) { swap(arr, l + (int)(rand() / double(RAND_MAX) * (r - l + 1)), r); int *p = partition(arr, l, r); quickSort(arr, l, p[0] - 1); //递归调用 quickSort(arr, p[1] + 1, r); //递归调用 } } int main(){ int arr1[6] = { 6, 2, 3, 5, 3,9}; srand((unsigned)time(0)); quickSort(arr1, 0, 5); //排序,PS:范围是0到数组长度减一 for (int i = 0; i < 6; i++) { cout << arr1[i] << ' '; } cout << endl; return 0; }