Algorithmic Implementation series(7) Implementation of Randomized_Quick_Sort

来源:互联网 发布:淘宝仓库里的宝贝在哪 编辑:程序博客网 时间:2024/05/18 20:50

Compiler: gcc 4.7.3

C++ Standard: C++0X

OS: CentOS 6.3 x86

 1 #include <iostream>                                                                                 
  2 #include <random>
  3 
  4 using namespace std;
  5 
  6 //swap the ith element and the jth element in an array
  7 void swap_elements(int ia[], const size_t i, const size_t j) {
  8     if(i == j) { return; }
  9     const int tmp = ia[i - 1];
 10     ia[i - 1] = ia[j - 1];
 11     ia[j - 1] = tmp;
 12 }
 13 
 14 const size_t partition(int ia[], const size_t p,const size_t r) {
 15     //The value of variable x is the last element in array ia.
 16     const int x = ia[r - 1];
 17 
 18     //Variable i marks the position before the first element in
 19     //array ia.
 20     int i = p - 2;
 21 
 22     //The for loop goes from the first element inclusive to one
 23     //before the last element in array ia.
 24     for(size_t j = p; j != r; ++j) {
 25         if(ia[j - 1] <= x) {
 26             ++i;
 27             swap_elements(ia, i + 1, j);
 28         }
 29     }
 30     swap_elements(ia, i + 2, r);
 31     return i + 2;
 32 }
 33 
 34 void Quick_Sort(int ia[], const size_t p,const size_t r) {
 35     if(p < r) {
 36         const size_t q = partition(ia, p, r);
 37         Quick_Sort(ia, p, q - 1);
 38         Quick_Sort(ia, q + 1, r);
 39     }
 40 }
 41                                               
 42 
 43 //Generating random value between p and r inclusive.
 44 const size_t random(const size_t p, const size_t r) {
 45     static default_random_engine e;
 46     uniform_int_distribution<unsigned> u(p, r);
 47     return u(e);
 48 }   
 49     
 50 const size_t randomized_partition(int ia[], const size_t p,
 51                         const size_t r) {
 52 
 53     const size_t i = random(p, r);
 54     swap_elements(ia, i, r);
 55 
 56     return partition(ia, p, r);
 57 }
 58 
 59 void Randomized_Quick_Sort(int ia[], const size_t p, const size_t r) {
 60     if(p < r) {
 61         const size_t q = randomized_partition(ia, p, r);
 62         Randomized_Quick_Sort(ia, p, q - 1);
 63         Randomized_Quick_Sort(ia, q + 1, r);
 64     }
 65 }
 66 
 67 int main() {
 68     int ia[] = {2, 32, 4, 5, -33, -55, 65, 90, -33, -42, 11, 105};
 69 
 70     const size_t size = sizeof(ia)/sizeof(int);
 71 
 72     for(size_t i = 0; i != size; ++i) {
 73         cout << ia[i] << " ";
 74     }
 75     cout << endl;
 76 
 77     Randomized_Quick_Sort(ia, 1, size);
 78 
 79     for(size_t i = 0; i != size; ++i) {
 80         cout << ia[i] << " ";
 81     }
 82     cout << endl;
 83 
 84     return EXIT_SUCCESS;
 85 }

原创粉丝点击