介绍数据结构中主要排序算法的流程与具体实现。包括以下八个排序算法:插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序、基数排序。
一、排序算法一览
排序方法 | 时间复杂度 | 空间复杂度 | 稳定性 | 所属类别 |
---|---|---|---|---|
插入排序 | O(n²) | O(1) | √ | 插入法 |
选择排序 | O(n²) | O(1) | ×(√) | 选择法 |
冒泡排序 | O(n²) | O(1) | √ | 交换法 |
希尔排序 | O(n¹˙³) | O(1) | × | 插入法 |
快速排序 | O(nlogn) | O(logn) | × | 交换法 |
堆排序 | O(nlogn) | O(1) | × | 选择法 |
归并排序 | O(nlogn) | O(n) | √ | - |
基数排序 | O(d*n) | O(n) | √ | - |
二、具体算法实现
(一)插入排序
/**
* 插入排序
* @param list 待排序的数组
* @param size 待排序的数组大小
*/
void insertionSort(int* list, int size){
for (int i = 1; i < size; ++i) {
//"无序区首位元素"小于"有序区尾部元素"时,将当前元素插入有序区 (无序区"首位元素"为i对应的当前元素, 有序区尾部元素为i-1对应的上一元素)
if (list[i] < list[i-1]){
int temp = list[i];
int j;
//将有序区中所有大于当前元素的值整体向后移动一步
for (j = i-1; temp < list[j] && j >= 0; --j) {
list[j+1] = list[j];
}
//将当前元素放入正确的位置
list[j+1] = temp;
}
}
}
(二)选择排序
/**
* 选择排序
* @param list 待排序的数组
* @param size 待排序的数组大小
*/
void selectionSort(int* list, int size){
for (int i = 0; i < size; ++i) {
int minIndex;
//遍历无序区
//找到无序区最小的元素, 并保存其下标
for (int j = i; j < size; ++j) {
if (list[j] < list[minIndex]){
minIndex = j;
}
}
//将"无序区最小元素"与"无序区首位元素"互换("无序区首位元素"为i对应的当前元素)
//此时新的"无序区的首位元素"进入有序区尾部
if (i != minIndex){
int temp = list[i];
list[i] = list[minIndex];
list[minIndex] = temp;
}
}
}
(三)冒泡排序
/**
* 冒泡排序
* @param list 待排序的数组
* @param size 待排序的数组大小
*/
void bubbleSort(int* list, int size){
for (int i = 0; i < size; ++i) {
for (int j = i; j < size; ++j) {
if (list[j] > list[j+1]){
int temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
}
(四)希尔排序
(五)快速排序
(六)堆排序
(七)归并排序
(八)基数排序
参考文档
- 《数据结构及应用算法教程 严蔚敏 陈文博 著》
- 《软件设计师教程 胡圣明 褚华 著》