思想:
选择一个参考值(这个参考值是可以任意的,一般选择左边界数或者右边界数或者中间数来做参考数),在数据的头和尾设置两个指针,每次比较这两个指针所指的数与参考值的大小,具体方法我们通过例子来理解:
拿一组数据为例: 我们设立左边界数4为参考值
一开始我们设立两个指针,分别指向左边的4以及右边的1
之后我们对左边的指针所指的数与参考值进行比较
左指针移动的条件是:(左指针所指的数)<=参考数
4=4,左边指针向又移动一位
之后我们继续进行比较,2<4,左边指针继续向右移动一位
当左指针指向6时,6>4不符合条件,所以我们对右指针进行操作
右指针需要的条件是 (右指针所指的数)>=参考数
1<参考数4
当两个指针都停止移动时,我们交换两个指针所指的数
这样子我们就能保证左指针左边的数(包括左指针所指的数)都是小于等于参考数的,右指针右边的数(包括右指针所指的数)都是大于等于参考数的。
之后,我们在对左指针左边的数再使用上述方法一次
右指针右边的数再使用上述方法一次(递归),既可达到快速排序的目的。
编译器:VS2022 代码实现:
#include<iostream>
using namespace std;
const int N= 1e6 + 10;
int n;
int q[N];
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;//判断数据是否只有一个
int x = q[l]; int i = l - 1; int j = r + 1;//设立参考值x,左指针i 右指针j
while (i < j)
{
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i <= j) swap(q[i], q[j]);
}
quick_sort(q, l, j);//对左指针左边的数进行排序
quick_sort(q, j + 1, r);//对右指针右边的数进行排序
}
int main()
{
scanf_s("%d", &n);
for (int i = 0; i < n; i++) scanf_s("%d", &q[i]);
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++) printf("%d ", q[i]);
return 0;
}