冒泡排序
1 | void BubbleSort(int a[], int n) { |
两端同时开始比较交换,衍生出双向冒泡算法
1 | void DbubbleSort(int a[], int n) { |
插入排序
1 | void InsertSort(int a[], int n) { |
希乐排序
分成多个增量,依次按增量进行插入排序,但最后一个增量必须是1,如:5,3,1
1 | static void ShellInsert(int a[], int dk, int n) { //dk为当前增量 |
直接选择排序
1 | void SelectSort(int a[], int n) { |
堆排序
堆排序是利用堆(完全二叉树)这种数据结构而设计的一种排序算法,堆排序是一种选择排序
1 | void Sift(int a[], int i, int h) { |
快速排序
1 | /* |
归并排序
1 | void outerMerge(int data1[ ], size_t size1, |
总结:
- 时间复杂度
1) 直接插入、直接选择、冒泡排序算法的时间复杂度O($n^2$)
2) 快速、归并、堆排序算法的时间复杂度为O($nlog_2n$)
3) 希尔排序算法的时间复杂度很难计算,有几种较接近的答案:O($nlog_2n$)或O($n^{1.25}$) - 稳定性
1) 直接插入、冒泡、归并排序算法是稳定的
2) 直接选择、希尔、快速和堆排序算法是不稳定的 - 空间复杂度
1) 直接插入、直接选择、冒泡、希尔和堆排序算法空间复杂度为O(1)
2) 快速排序算法空间复杂度为O($log_2n$)
3) 归并排序算法空间复杂度为O($n$) - 排序算法的选取
1) 若待排序的一组记录数目n较小(如$n \leq 50$)时,可采用插入排序或选择排序
2) 若$n$较大时,则就采用快速排序、堆排序或归并排序
3) 若待排序记录按关键字基本有序时,则适宜用直接插入排序或冒泡排序
4) 关键字比较次数与记录的初始排列顺序无关的排序方法是选择排序