快排的主要思想:分治
l为最左边,r为最右边
1.确定分界点:q[l],q[(l+r)/2],q[r]随机值都可以,值为x
2.调整区间:一分为二,左边小于等于x,右边大于等于x
3.递归处理左右两边
#include<stdio.h>
const int N = 1e5 + 10;
int q[N];
void quick_sort(int q[], int l, int r){
if(l >= r) return ;
int x = q[l + r >> 1];
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){
int temp = q[i];
q[i] = q[j];
q[j] = temp;
}
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
int main()
{
int n;
scanf("%d\n",&n);
for(int i = 0; i < n; i++) scanf("%d",&q[i]);
quick_sort(q,0,n-1);
for(int i = 0; i < n; i++) printf("%d ",q[i]);
return 0;
}
可以查看每一次代码运行理解其原理
#include<stdio.h>
const int N = 1e5 + 10;
int q[N];
void quick_sort(int q[], int l, int r){
if(l >= r) return ;
int x = q[l + r >> 1];
int i = l - 1;
int j = r + 1;
printf("%d %d %d\n",q[i+1],q[j-1],x);
while(i < j){
do i++; while(q[i] < x);
do j--; while(q[j] > x);
if(i < j){
int temp = q[i];
q[i] = q[j];
q[j] = temp;
printf("i = %d j = %d %d %d %d\n",i,j,q[i],q[j],x);
for(int i = 0; i < 9; i++) printf("%d ",q[i]);
}
putchar(10);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
int main()
{
int n;
scanf("%d\n",&n);
for(int i = 0; i < n; i++) scanf("%d",&q[i]);
quick_sort(q,0,n-1);
for(int i = 0; i < n; i++) printf("%d ",q[i]);
return 0;
}