基本排序方法及分析(九):Randomized-Quicksort快速排序的随机化版本

基本排序方法及分析(九):Randomized-Quicksort快速排序的随机化版本

Quicksort是一个很好的排序算法,但是其最坏情况运行时间是O(n^2), 还不如Mergesort的O(nlgn),
如何改进Quicksort? 引进随机化思想
一种方法: 对给定的待排序序列,随机地重排列
另一种方法:随机选取pivot

给出第二种方法的代码

 1 /**/ /**
 2 * 2010.1.24
 3 * 随机快速排序法 
 4 * pivot元素并不是简单地取第一个元素,而是随机生成一个下标,以对应的元素为pivot 
 5 */
 
 6
 7 #include  < iostream >  
 8 #include  < cstdlib >
 9 #include  < ctime >  
10
11 using   namespace  std; 
12
13 // 交换两个元素值 
14 void  swap( int &  a ,  int &  b)
15 {
16     int temp = a;
17     a = b;
18     b = temp;
19}

20
21 // 输出数组 
22 void  print( int *  a ,  int  n)
23 {
24     for(int i = 0; i < n ; i++)
25             cout << a[i]<<",";
26     cout << endl;
27}

28
29 // 返回属于[p,q)的随机整数 
30 int  rand( int  p, int  q)
31 {
32     int size = q-p+1;
33     return  p+ rand()%size; 
34}

35
36 // 分割 
37 int  RandPartition( int *  a,  int  p ,  int  q)
38 {    
39     //普通的分割方法和随机化分割方法的区别就在于下面三行 
40     swap(a[rand(p,q)], a[p]);
41     int key = a[p];
42     int i = p;
43     
44     for(int j = p+1; j <= q; j++)
45     {
46           if(a[j] <= key)
47           {
48                   i = i+1;
49                   if(i != j) 
50                        swap(a[i], a[j]);                 
51           }
            
52     }
 
53     
54     swap(a[i],a[p]);
55    
56     return i;
57}

58
59 // 逐步分割排序 
60 void  RandQuickSortMid( int *  a,  int  p,  int  q)
61 {
62     if(p<q)
63     {
64            int i = RandPartition(a,p,q);
65            RandQuickSortMid(a,p,i-1);
66            RandQuickSortMid(a,i+1,q);
67     }

68}

69
70 // 调用 
71 void  RandQuickSort( int *  a,  int  n)
72 {
73     //记录运行时间
74     clock_t start,end;
75     start = clock();
76
77     RandQuickSortMid(a,0,n-1);
78
79     end = clock();
80     cout << "Running time: " << (double)(end-start)/CLOCKS_PER_SEC << endl;
81}

82
83
84 int  main()
85 {
86    const int N = 20;
87    int *= new int[N];    
88    for(int i = 0; i < N; i++)
89            a[i] = rand();  
90   
91    print(a,N);
92    RandQuickSort(a,N);   
93    print(a,N);
94    
95    system("pause");
96    return 0;
97}

你可能感兴趣的:(基本排序方法及分析(九):Randomized-Quicksort快速排序的随机化版本)