1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
| #include <iostream>
#include <vector>
#include <cstdlib>
#include <iterator>
#include <utility>
using namespace std;
template <typename T>
void swaping (T &a, T &b)
{
T c;
c = a;
a = b;
b = c;
}
template<class RandomAccessIterator>
RandomAccessIterator partitioning (RandomAccessIterator first,
RandomAccessIterator last)
{
RandomAccessIterator beg = first - 1;
int pivot = *(last - 1);
for (RandomAccessIterator end = first; end != last - 1; ++end)
if (*end < pivot + 1)
{
++beg;
swaping (*beg, *end);
}
swaping (*(beg + 1), *(last - 1));
return (beg + 1);
}
template<class RandomAccessIterator>
RandomAccessIterator random_partitioning (RandomAccessIterator first,
RandomAccessIterator last)
{
RandomAccessIterator random_iterator = rand()% (last - first - 1) + first;
swaping (*(random_iterator), *(last - 1));
return partitioning<RandomAccessIterator> (first, last);
}
template<class RandomAccessIterator>
void quick_sort (RandomAccessIterator first,
RandomAccessIterator last)
{
if (first < last - 1)
{
RandomAccessIterator median = random_partitioning<RandomAccessIterator> (first, last);
quick_sort<RandomAccessIterator> (first, median);
quick_sort<RandomAccessIterator> (median + 1, last);
}
}
template <class RandomAccessIterator>
void quick_sortn (RandomAccessIterator first, RandomAccessIterator last)
{
while (first < last - 1)
{
RandomAccessIterator median = random_partitioning<RandomAccessIterator> (first, last);
if (median - first < last - median)
{
quick_sortn(first, median);
first = median + 1;
}
else
{
quick_sortn(median, last);
last = median;
}
}
}
int main ()
{
int size;
cin >> size;
vector <int> v;
for (int i = 0; i < size; ++i)
{
int inp;
cin >> inp;
v.push_back(inp);
}
//vector <int>::iterator first = v.begin();
//vector <int>::iterator last = v.end() - 1;
cout << endl;
cout << endl << endl;
quick_sortn<vector <int>::iterator> (v.begin(), v.end());
cout << endl;
for (vector <int>::iterator it = v.begin(); it < v.end(); ++it) cout << *it << ' ';
return 0;
} |