BYRBT

快速排序

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 int z[100],n;
 8 
 9 //快速排序的思想是递归
10 //以当前区间中的某个元素为基准 将比它小的放到前面 比它的放到后面 这样之后可以分而治之 因为以它为一个值的分界已经将比它小的放到了前半部分 比它大的放到了后面部分 这样便可以又对前半部分和后半部分执行同样的递归操作 最终完成排序
11 
12 void qsort(int a,int b)//当前要处理a-b这个区间
13 {
14     int c=a,d=b;
15     int e=z[(a+b)>>1];//e是基准值 我们取这个区间中间的值作为基准值 当然其他的值也可以
16     int f;//f仅作为交换元素时的一个辅助变量
17     while(c<=d)//如果中间还有一段没有处理
18     {
19         while(z[c]<e) 
20             c++;//找到一个大于等于基准值的数
21         while(z[d]>e) 
22             d--;//找到一个小于等于基准值的数
23         if(c<=d)//如果较大的那个数在较小的那个数之前 我们就需要交换这两个数的位置
24         {
25             f=z[c];
26             z[c]=z[d];
27             z[d]=f;//交换
28             c++;
29             d--;
30         }
31     }
32     //这样做完一次之后 我们可以保证 (d+1)到(c-1)这个区间内的元素是有序的
33     if(c<b) qsort(c,b);//处理左边还未排序的区间
34     if(a<d) qsort(a,d);//处理右边还未排序的区间
35 }
36 
37 int main()
38 {
39     scanf("%d",&n);//读入有多少个数
40     for (int a=1;a<=n;a++)
41         scanf("%d",&z[a]);//读入每一个数
42     qsort(1,n);//我们需要处理1-n这个区间里的所有数
43     //sort(z+1,z+n+1);//这是c++自带的那个函数 需要在前面加上 #include<algorithm>
44     for (int a=1;a<=n;a++)
45         printf("%d\n",z[a]);//输出
46 
47     return 0;
48 }
posted @ 2012-09-29 21:30  zhonghaoxi  阅读(242)  评论(0编辑  收藏  举报
BYRBT