该算法的实现可分为以下几步:
-
在数组中选一个基准数(通常为数组第一个);
-
将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边,即将数组一分为二,一般右边均大于基准数,左边均小于基准数;
-
运用递归,对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素(递归出口),即为全部有序。
(代码来源于AcWing第785题)
#include3. 总结using namespace std; const int N = 1e6 + 10; int n; int nums[N]; //快速排序算法 void quick_sort(int nums[], int l, int r){ if(l >= r) return ;//递归出口 //基准数以及双指针 int x = nums[l + r >> 1], i = l - 1, j = r + 1; while(i < j ){ //指针向中间移动,找到不符的点就交换 do i ++; while(nums[i] < x); do j --; while(nums[j] > x); if(i < j) swap(nums[i], nums[j]); } //将分好的两组分别排序,需注意分界点 quick_sort(nums, l, j); quick_sort(nums, j+1, r); } int main(){ //输入 scanf("%d",&n); for(int i = 0; i < n; i ++) scanf("%d",&nums[i]); //排序 quick_sort(nums, 0, n-1); //输出 for(int i = 0; i < n; i ++) printf("%d ",nums[i]); return 0; }
需要注意分界点!设计的临界值的位置和两个新的数组需要注意!



