Bubble Sort
Basic Idea
起泡排序(Bubble Sort) 过程中,关键字较小的记录好比水中气泡逐趟向上漂浮,关键字较大的记录好比石头往下沉,每一趟有一块“最大”的石头沉入水底。
Description
第
1
趟起泡排序:将第1
个记录的关键字与第2
个记录的关键字比较,若为逆序,则交换。再比较第2
与第3
个记录的关键字……依次类推,直至第n-1
与第n
个记录的关键字比较完为止。n-1
次比较、交换的结果是选出了正序中第n
个记录。第
i
趟起泡排序:对前n-i
个记录进行与第1
趟同样的操作。n-i
次比较、交换的结果是选出了正序中第n-i
个记录。重复步骤
2
,直至本趟排序无记录交换
或i = n
为止。
Implement
- Time Complexity: O(n^2)
- Space Complexity: O(n)
- Oder By: asc
- Language: C++ 14
1 |
|
Quick Sort
Basic Idea
快速排序(Quick Sort) 是对起泡排序的一种改进,通过一趟排序将待排记录分割成独立的两部分,其中一部分的关键字均比另一部分的关键字小。再分别对这两部分记录进行排序,以达到整体有序。
Description
对待排序列选取任意一个记录(通常选第一个)作为枢轴(pivot),其关键字为
pivot_key
。附设两个指针low
和high
。一趟快速排序:
high
向前搜索,找到第1
个关键字小于pivot_key
的记录,将其与枢轴记录交换;low
向后搜索,找到第1
个关键字大于pivot_key
的记录,将其与枢轴记录交换;重复这两步,直至low = high
为止。产生两个子序列。将产生的两个子序列再分别进行快速排序,产生两个子序列。
重复步骤
3
,直至待排序列中只有一个记录为止。
Implement
- Time Complexity: O(n*log n)
- Space Complexity: O(n)
- Oder By: asc
- Language: C++ 14
Version 11
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename T>
void quick_sort(vector<T> &array, int begin, int end) {
if (begin < end - 1) {
T pivot_key = array[begin];
int low = begin, high = end - 1;
while (low < high) {
while (low < high && array[high] >= pivot_key) high--;
swap(array[low], array[high]);
while (low < high && array[low] <= pivot_key) low++;
swap(array[low], array[high]);
}
quick_sort(array, begin, low);
quick_sort(array, low + 1, end);
}
}
Version 2(优化)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<typename T>
void quick_sort(vector<T> &array, int begin, int end) {
if (begin < end - 1) {
int low = begin, high = end - 1;
while (low < high) {
while (low < high && array[high] >= array[begin]) high--;
while (low < high && array[low] <= array[begin]) low++;
swap(array[low], array[high]);
}
swap(array[begin], array[low]);
quick_sort(array, begin, low);
quick_sort(array, low + 1, end);
}
}
Version 3(再度优化)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<typename T>
void quick_sort(vector<T> &array, int begin, int end) {
if (begin < end - 1) {
T pivot_key = array[begin];
int low = begin, high = end - 1;
while (low < high) {
while (low < high && array[high] >= pivot_key) high--;
array[low] = array[high];
while (low < high && array[low] <= pivot_key) low++;
array[high] = array[low];
}
array[low] = pivot_key;
quick_sort(array, begin, low);
quick_sort(array, low + 1, end);
}
}
Straight Insertion Sort
Basic Idea
直接插入排序(Straight Insertion Sort) 的基本思想是将一个记录插入到一个有序序列中,从而得到一个新的、记录数增1
的有序序列。
Description
将当前的第
i
个记录插入由 第1
个记录到第i-1
个记录 组成的有序子序列中。从第
2
个记录开始,到第n
个记录为止,依次重复步骤1
。
Implement
- Time Complexity: O(n^2)
- Space Complexity: O(n)
- Oder By: asc
- Language: C++ 14
1 |
|
Shell's Sort
Basic Idea
希尔排序(Shell's Sort) 又称 缩小增量排序(Diminishing Increment Sort),是一种对简单插入排序的优化。它的基本思想是:将待排序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”,再对全体记录进行一次直接插入排序。
Description
按照 增量(间隙 gap) 划分成若干子序列,如
gap = 3
,划分{R1, R2, R3, R4, R5, R6, R7}
为{R1, R4, R7}
和{R2, R5}
和{R3, R6}
。对每个子序列分别进行直接插入排序。递减增量,重复步骤
1
,直至gap = 1
为止。
Implement
- Time Complexity: ? ? ?
- Space Complexity: O(n)
- Oder By: asc
- Language: C++ 14
1 | // sort.h |
Using
1 | // main.cpp |
[*] Caution! 增量(间隙)序列gap
应满足如下条件:
- 记录的关键字递减。
- 除最后一个记录外,其余所有记录的关键字没有除
1
外的公因子。 - 最后一个记录的关键字为
1
。
Simple Selection Sort
Basic Idea
简单选择排序(Simple Selection Sort) 的基本思想是:通过n-i
次关键字间的比较,从n-i+1
个记录中选出关键字最小的记录,并和第i
个记录交换。
Implement
- Time Complexity: O(n^2)
- Space Complexity: O(n)
- Oder By: asc
- Language: C++ 14
1 |
|
Heap Sort
Basic Idea
堆(Heap) 对应一颗完全二叉树,且该树中所有非终端结点的值均不大于(或不小于)其左右孩子节点的值。
堆排序(Heap Sort) 需要解决两个问题:
如何构建一个堆?
堆顶输出后,如何维护堆的性质?
Description
已知:
第
i
个节点的父节点的索引为floor((i-1)/2)
第
i
个节点的左孩子节点的索引为2*i+1
第
i
个节点的右孩子节点的索引为2*i+2
Implement
- Time Complexity: O(n*log n)
- Space Complexity: O(n)
- Oder By: asc
- Language: C++ 14
1 | // sort.h |
Using
- 非STL(自定义)
1 | // main.cpp |
- STL(推荐)
1 | // main.cpp |
2-Way Merging Sort
Basic Idea
2-路归并排序(2-Way Merging Sort) 和上述方法均不相同。“归并”的意思是将两个或两个以上的有序表组合成一个新的有序表。
Description
将待排序列分隔成
n
个单位为1
的子序列,相邻的子序列两两比较合并成单位为2
的n/2
个子序列重复步骤
1
,合并后的子序列的单位为floor(2^i)
,直至floor(2^i) = n
为止。
Implement
- Time Complexity: O(n*log n)
- Space Complexity: O(n)
- Oder By: asc
- Language: C++ 14
1 |
|