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 }