-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
quickSort.h
69 lines (58 loc) · 2.39 KB
/
quickSort.h
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
/***
* _ __ ___ _
* | |/ /___ ___ _ __ / __|__ _| |_ __
* | ' </ -_) -_) '_ \ | (__/ _` | | ' \
* |_|\_\___\___| .__/ \___\__,_|_|_|_|_|
* |_|
* _
* __ _ _ _ __| |
* / _` | ' \/ _` |
* \__,_|_||_\__,_|
*
* _ _ _ _ _ _
* | | ___ __ _ _ _ _ _ /_\ | |__ _ ___ _ _(_) |_| |_ _ __ ___
* | |__/ -_) _` | '_| ' \ / _ \| / _` / _ \ '_| | _| ' \| ' \(_-<
* |____\___\__,_|_| |_||_| /_/ \_\_\__, \___/_| |_|\__|_||_|_|_|_/__/
* |___/
* Yeah! Ravi let's do it!
*/
#ifndef QUICK_SORT_H
#define QUICK_SORT_H
#include <generic.h>
namespace algo {
//Partition routine for quicksort
template <typename T>
static int __partition(T list[], int start, int end)
{
int pivotIndex = random_range(start, end);
T pivot = list[pivotIndex];
//Swapping pivot element with element at start
swap(list[start], list[pivotIndex]);
int i = start + 1;
int j = end;
while (i <= j) {
while ((i <= end) && (list[i] <= pivot)) {
++i;
}
while ((j >= start) && (list[j] > pivot)) {
--j;
}
if (i < j) {
swap(list[i], list[j]);
}
}
swap(list[start], list[j]);
return j;
}
//quickSort Routine
template <typename T>
static void quickSort(T list[], int start, int end)
{
if (start < end) {
int pivotIndex = __partition<T>(list, start, end);
quickSort(list, start, pivotIndex - 1);
quickSort(list, pivotIndex + 1, end);
}
}
}//end of namespace algo
#endif //end of quickSort.h