Algorithm Sort

本文记录各种排序算法

merge sort

对一个无序数组,在每一次迭代中,平均分为2份,之后进行合并。同值元素可保序。

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
vector<int> merge_sort(vector<int>&arr) {
if (arr.size() <= 1) {
return arr;
}
int middle = (0 + arr.size()) / 2;
vector<int> partition1 = vector(arr.begin(), arr.begin() + middle);
vector<int> partition2 = vector(arr.begin() + middle, arr.end());
//sort each part recursively
partition1 = merge_sort(partition1);
partition2 = merge_sort(partition2);
//merge all partitions together
vector<int>output;
int i = 0, j = 0;
while (true) {
int a = partition1[i];
int b = partition2[j];
if (a < b) {
i++;
output.push_back(a);
} else {
j++;
output.push_back(b);
}
if (i == partition1.size()) {
for (; j < partition2.size(); j++) {
output.push_back(partition2[j]);
}
break;
}
if (j == partition2.size()) {
for (; i < partition1.size(); i++) {
output.push_back(partition1[i]);
}
break;
}
}
}

  • Time complexity:
    T(n) <= 2 T(n / 2) + O(n)
    <= 2
    (2 T(n / 4) + O(n / 2)) + O(n) = 4 T(n / 4) + 2 O(n)
    <= ……
    <= 2k
    T(n / 2k) + k O(n)
    So T(n) <= O(n
    log(n))