Algorithmic Implementation series(7) Implementation of Randomized_Quick_Sort

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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值