快速排序,一种不稳定但很nb的排序
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。(度娘解释)
到底啥意思?
![疑问](http://static.blog.csdn.net/xheditor/xheditor_emot/default/doubt.gif)
st解读:也就是说,一些数排成一列,从中间分为两段,辣么从两节开始,分别找数。先从第一节开始,如果这个数小于中间数不管,继续;else 比中间大,停下来,扫描第二节。从第二节开始,如果这个数大于中间数不管,继续;else 比中间小,停下来,与前面那个交换位置。 如此反复,就可以得到一个保证第一节每个数都比后面一节小。这是用递归手法,递归第一节,递归第二节。便可以得到一个从小到大排列的数列!
那么代码如何实现?
答:递归!
上代码!
#include<stdio.h>
#include<stdlib.h>
#define MAX 1001
int a[MAX];
void qsort(int l,int r){//核心,凑合着看吧
int i,j,k,m;
i=l; j=r; m=a[(i+j)/2];
do{
while (a[i]<m) i++;//找出那个大于m的数
while (a[j]>m) j--;//找出那个小于m的数
if (i<=j){//交换
k=a[i]; a[i]=a[j]; a[j]=k;
i++; j--;
}
}while (i<=j);
if (l<j) qsort(l,j);//分别再递归
if (i<r) qsort(i,r);
}
int main(){
int n,i,j;
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
qsort(1,n);
for (i=1;i<=n;i++)
printf("%d ",a[i]);
puts("");
return 0;
}
是不是恍然大悟了?
跪求赞求访问求评论!