可以把扫描到的小于x的数和大于x的数放在两个数组里,最后再将两个数组合并起来,这样是比较粗糙的方法
比较好的方法是利用两个指针,一个从左往右扫描大于x的值,一个从右往左扫描比x小的数,两个都扫描到以后交换。当两个指针相遇时即为扫描结束
#include <iostream>
using namespace std;
int n;
const int N = 1e6 + 10;
int q[N];
void Quicksort(int q[], int l, int r)
{
if (l >= r)
return;
int x = q[(l+r)/2];
int i = l - 1;
int j = r + 1;
while (i < j)
{
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if(i<j)
swap(q[i], q[j]);
}
Quicksort(q, l, j);
Quicksort(q, j + 1, r);
return;
}
int main()
{
scanf_s("%d", &n);
for (int i = 0; i < n; i++)
{
scanf_s("%d", &q[i]);
}
Quicksort(q, 0, n - 1);
for (int i = 0; i < n; i++)
{
printf("%d", q[i]);
}
return 0;
}
要注意两个指针,刚开始是指在外侧的,刚开始的l是-1,r是n,为了达到先移动后指数的效果
快速排序算法有很多细节需要注意
递归调用传值的时候可能会造成死循环,还有选择参数x的时候最好选择中间值或随机值,选第一个值可能会使算法的时间复杂度退化为n^2,所以比起自己想和尝试更推荐记住这个模板
1e6+10表示1000000
为了用N初始化数组q的大小,需要将N初始化为const int