第一种是老师在课上讲的,B站https://www.bilibili.com/video/BV1sJ41127t2 这个视频挺好的我觉得。。
大体是先找一个基准数,从右边开始找一个比他小的(j),放到基准数的位置,从左边开始找(i),找到比基准数大的,放到j的位置,当i=j的时候把基准数放到i(j)这个位置上,然后递归就可以。
#include<stdio.h>
int n;
void qsort(int b[],int l,int r)
{
if(l>=r) return;
int i=l,j=r,key=b[l];
while(i<j){
while(i<j&&b[j]>=key) j--;
if(i<j) b[i]=b[j];
while(i<j&&b[i]<=key) i++;
if(i<j) b[j]=b[i];
}
b[i]=key;//这时候i=j,把基准数放进这个位置
qsort(b,l,i-1);//递归
qsort(b,i+1,r);
}
int main(){
int i,j,t,a[100],count;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
qsort(a,0,n-1);
for(i=0;i<n;i++)
printf("%4d",a[i]);
return 0;
}
第二种是啊哈算法上看到的,具体可以找一下书,讲的很明白。
大体是先确定一个基准数,从右边找一个比它小的(j),然后从左边找一个比它大的(i),如果i<j交换位置,i=j,就把i位置的数跟基准数交换。然后递归。
#include<stdio.h>
void qs(int a[],int l,int r)
{
if(l>r) return;
int i=l,j=r,temp=a[l],t;
while(i!=j)
{
while(i<j&&a[j]>=temp) j--;
while(i<j&&a[i]<=temp) i++;
if(i<j)
t=a[i],a[i]=a[j],a[j]=t;
}
a[l]=a[i];
a[i]=temp;
qs(a,l,i-1);
qs(a,i+1,r);
return;
}
int main()
{
int a[10],i,j,n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
qs(a,0,n-1);
for(i=0;i<n;i++)
printf("%4d",a[i]);
return 0;
}
初学勿喷,有建议评论互相学习