您的位置:首页 > 编程语言

快速排序【记录一下代码】

2017-03-20 19:10 281 查看
本文仅用作学习记录,大神勿喷O(∩_∩)O~

代码一、百度百科C++语言版本代码,参考数据结构p274(清华大学出版社,严蔚敏)

1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<time.h>
4
5 int cmp(const void *a,const void *b)
6 {    return *(int*)a - *(int*)b;   }
7 int main()
8 {
9     int a[50],b[50],c[50],d[50],e[50],f[50],g[50],h[50];
10     int n,i,k=100000,index=1,count=0;
11     srand((unsigned)time(0));
12
13     freopen("res.out","w",stdout);
14     for(;k>0;k--)
15     {
16         n=(rand()%2==1?49:50);
17          for(i=0;i<n;i++)
18          {
19              a[i]=rand()%3000;
20              h[i]=g[i]=f[i]=e[i]=d[i]=c[i]=b[i]=a[i];
21         }
22
23         Qsort1(a, 0, n - 1);
24         Qsort2(b, 0, n - 1);
25          qsort(c,n,sizeof(c[0]),cmp);
26          Qsort3(e,0,n-1);
27          Qsort4(f,0,n-1);
28          Qsort5(g,0,n-1);
29          Qsort6(h,0,n-1);
30
31         for(i= 0; i < n; i++)
32         {
33             if(a[i]!=c[i]||b[i]!=c[i]||e[i]!=c[i]||f[i]!=c[i]||g[i]!=c[i]||h[i]!=c[i])
34                 break;
35         }
36         if(i<n)
37         {
38             printf("case %d:\n",index);
39             printf("A:");//Qsort1的结果
40             for(i=0;i<n;i++)
41                 printf("%d ",a[i]);
42                printf("\n");
43
44                printf("B:");//Qsort2的结果
45             for(i=0;i<n;i++)
46                 printf("%d ",b[i]);
47                printf("\n");
48
49                printf("C:");//标准结果序列
50             for(i=0;i<n;i++)
51                 printf("%d ",c[i]);
52                printf("\n");
53
54                printf("E:");//Qsort3的结果
55             for(i=0;i<n;i++)
56                 printf("%d ",e[i]);
57                printf("\n");
58
59                printf("F:");//Qsort4的结果
60             for(i=0;i<n;i++)
61                 printf("%d ",f[i]);
62                printf("\n");
63
64                printf("G:");//Qsort5的结果
65             for(i=0;i<n;i++)
66                 printf("%d ",g[i]);
67                printf("\n");
68
69                printf("H:");//Qsort6的结果
70             for(i=0;i<n;i++)
71                 printf("%d ",h[i]);
72                printf("\n");
73
74                printf("D:");//原未排序序列
75             for(i=0;i<n;i++)
76                 printf("%d ",d[i]);
77                printf("\n");
78         }
79         else { printf("case %d is ok!\n",index); count++;}
80         index++;
81     }
82     printf("%d of %d is ok!\n",count,index-1);
83     return 0;
84 }


View Code

其实 Qsort1、Qsort2、Qsort5(博客园代码修改以后)三份代码是一样的
Qsort4跟上面几个是差不多的,但稍有一点点改变
Qsort3思路变化比较大一些。
Qsort6简直就是另类代码风格,瞎搞的,不过也是对的。
学习记住 Qsort1、Qsort2、Qsort5之一或者Qsort4即可。

注意:在快排过程中划分区间时,必须要有等号,比如:

int i=left,j=right,key=a[left];
while(i<j)
{
while(i<j&&key>=a[j]) j--;//必须取等号,否则当数组两头的数相等时会死循环
a[i]=a[j];
while(i<j&&key<=a[i]) i++;//必须取等号,否则当数组两头的数相等时会死循环
a[j]=a[i];
}


这种地方>=不能改为>,否则可能死循环。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: