-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQuickSort.cs
More file actions
106 lines (85 loc) · 2.54 KB
/
QuickSort.cs
File metadata and controls
106 lines (85 loc) · 2.54 KB
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
namespace algorithms;
// Average case O(N logN)
// Worst case O(N^2)
// Space complexity O(logN)
public static class QuickSort
{
public static int[] Iterative(int[] array)
{
var left = 0;
var right = array.Length - 1;
var top = -1;
var stack = new int[array.Length];
stack[++top] = left;
stack[++top] = right;
while (top >= 0)
{
right = stack[top--];
left = stack[top--];
var p = PartitionIterative(array, left, right);
if (p - 1 > left)
{
stack[++top] = left;
stack[++top] = p - 1;
}
if (p + 1 < right)
{
stack[++top] = p + 1;
stack[++top] = right;
}
}
return array;
}
private static int PartitionIterative(int[] array, int left, int right)
{
var x = array[right];
var y = left - 1;
for (var i = left; i <= right - 1; ++i)
{
if (array[i] > x) continue;
++y;
(array[y], array[i]) = (array[i], array[y]);
}
(array[y + 1], array[right]) = (array[right], array[y + 1]);
return y + 1;
}
public static int[] Recursive(int[] array)
{
InternalRecursive(array, 0, array.Length - 1);
return array;
}
private static void InternalRecursive(int[] array, int left, int right)
{
if (left >= right)
return;
var partition = Partition(array, left, right);
InternalRecursive(array, left, partition);
InternalRecursive(array, partition + 1, right);
}
private static int Partition(int[] array, int left, int right)
{
var pivot = SelectPivot(array, left, right);
var idxLeft = left;
var idxRight = right;
while (true)
{
while (array[idxLeft] < pivot)
idxLeft++;
while (array[idxRight] > pivot)
idxRight--;
if (idxLeft >= idxRight)
return idxRight;
(array[idxLeft], array[idxRight]) = (array[idxRight], array[idxLeft]);
idxLeft++;
idxRight--;
}
}
private static int SelectPivot(int[] array, int left, int right)
{
var a = array[left];
var b = array[left + (right - left) / 2];
var c = array[right];
// selecting pivot taking mean value
return Math.Max(Math.Min(a, b), Math.Min(Math.Max(a, b), c));
}
}