快速排序。。。注意快速排序不适宜解决有重复数据的排序

 1 #include<stdio.h>  /*快速排序是的思想就是每一趟让标记右边的大于或小于标记位置的数,而且是让每一次的标记位置为空让标记位置l或g与i或h交换*/
2 int qsort2(int a[],int l,int h)
3 {
4 int key,i;
5 key = a[l]; /*取轴值记录关键字*/
6 while(l<h) /*从表的两端交替地向中间扫描,无等于号!!!!*/
7 {
8 while(l<h && key <= a[h])h--; /*将比轴值记录大的交换到高端*/
9 a[l] = a[h]; //此时l为空;
10 while(l<h && key >= a[l])l++;//注意等于号!!!!
11 a[h] = a[l]; //此时h为空
12 }
13 a[l] = key; //由于最后l==h所以lhuoh都为空,需加上值/*轴值(支点)记录到位*/
14 return l; /*返回轴值(支点)记录所在位置*/
15 }
16 void qsort(int a[],int l,int h)//分成两个字串,使其每一个字串都达到左右大于或等于为止
17 {
18 int k;
19 if(l<h)
20 {
21 k = qsort2(a,l,h); /*将待排序序列一分为二*/
22 qsort(a,l,k-1); //k处的位置已经确定无需变动/*对小于轴值序列实现递归排序*/
23
24
25 qsort(a,k+1,h);
26
27 }
28
29 }
30 void main()
31 {
32 int a[100];
33 int i,n;
34 while(scanf("%d",&n)&&n)
35 {
36 for(i=0;i<n;i++)
37 {
38 scanf("%d",&a[i]);
39 }
40 qsort(a,0,n-1);
41 for(i=0;i<n;i++)
42 {
43 printf("%d ",a[i]);
44 }
45
46 }
47 }
48
posted @ 2012-02-22 23:26  某某。  阅读(3488)  评论(0编辑  收藏  举报