快排是我们比较熟悉的排序算法,时间复杂度最佳为O(nlogn),最坏为O(n2)
随机化快排只是通过换轴将产生最坏情况可能性降低
1 #include<stdio.h>
2 #include<math.h>
3 #include<stdlib.h>
4 #include<iostream>
5 #include<time.h>
6 using namespace std;
7
8 int a[1000000];
9 int Partition(int a[],int p,int q)//随机化快排
10 {
11 int x,i,t;
12 int k=p+rand()%(q-p+1);//换轴
13 t=a[p];
14 a[p]=a[k];
15 a[k]=t;
16 x=a[p];
17 i=p;
18 for(int j=p+1;j<=q;j++)
19 {
20 if(a[j]<=x)
21 {
22 i++;
23 t=a[i];
24 a[i]=a[j];
25 a[j]=t;
26 }
27 }
28 t=a[p];
29 a[p]=a[i];
30 a[i]=t;
31 return i;
32 }
33
34 int Partition1(int a[],int p,int q)//快排
35 {
36 int x,i,t;
37 x=a[p];
38 i=p;
39 for(int j=p+1;j<=q;j++)
40 {
41 if(a[j]<=x)
42 {
43 i++;
44 t=a[i];
45 a[i]=a[j];
46 a[j]=t;
47 }
48 }
49 t=a[p];
50 a[p]=a[i];
51 a[i]=t;
52 return i;
53 }
54
55 void Quicksort(int a[],int p,int r)
56 {
57 int q;
58 if(p<r)
59 {
60 q=Partition(a,p,r);
61 Quicksort(a,p,q-1);
62 Quicksort(a,q+1,r);
63 }
64 }
65
66 int main()
67 {
68 int n,i;
69 srand(time(NULL));
70 printf("输入n:
");
71 while(~scanf("%d",&n))
72 {
73 for(i=1;i<=n;i++)
74 {
75 a[i]=rand();
76 }
77
78 int start,end;
79 start=clock();
80 Quicksort(a,1,n);
81 end=clock();
82 for(i=0;i<n;i++)
83 printf("%d ",a[i]);
84 printf("
");
85 printf("时间:%d
",end-start);
86 }
87 return 0;
88 }