1 常见排序的时间复杂度[1]
- 冒泡、选择、插入:O(n2)
- 快速、推、归并、希尔:O(n*log2n)
- 计数:O(n+m)
- 桶:O(n) | 排序算法 | 平均时间复杂度 | 最差时间复杂度 | 空间复杂度 | 数据对象稳定性 | | —- | —- | —- | —- | —- | | 冒泡排序 | O(n2) | O(n2) | O(1) | 稳定 | | 选择排序 | O(n2) | O(n2) | O(1) | 数组不稳定、链表稳定 | | 插入排序 | O(n2) | O(n2) | O(1) | 稳定 | | 快速排序 | O(nlog2n) | O(n2) | O(log2n) | 不稳定 | | 堆排序 | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 | | 归并排序 | O(nlog2n) | O(nlog2n) | O(n) | 稳定 | | 希尔排序 | O(nlog2n) | O(n2) | O(1) | 不稳定 | | 计数排序 | O(n+m) | O(n+m) | O(n+m) | 稳定 | | 桶排序 | O(n) | O(n) | O(m) | 稳定 | | 基数排序 | O(k*n) | O(n2) | | 稳定 |
2 常规排序算法的实现
2.1 冒泡排序
- 比较相邻元素,前者大于后者,则交换
常规
void bubbleSort(vector<int>& v) {int len = v.size();for (int i = 0; i < len - 1; ++i) {for (int j = 0; j < len - i - 1; ++j) {if (v[j] > v[j+1]) {swap(v[j], v[j+1]);}}}}
模板实现
template<typename T>void bubbleSort(T arr[], int len) {for (int i = 0; i < len - 1; ++i) {for (int j = 0; j < len - i - 1; ++j) {if (arr[j] > arr[j + 1]) {swap(arr[j], arr[j + 1]);}}}}
2.2 选择排序
在无序区找最小值放到有序区后面
void selectionSort(vector<int>& v) {int min, len = v.size();for (int i = 0; i < len - 1; ++i) {min = i;for (int j = i + 1; j < len; ++j) {if (v[j] < v[min]) min = j;}if (i != min) swap(v[i], v[min]);}}
模板实现
template<typename T>void selectionSort(std::vector<int>& v) {int len = v.size();int min, len = v.size();for (int i = 0; i < len - 1; ++i) {min = i;for (int j = i + 1; j < len; ++j) {if (v[j] < v[min]) min = j;}if (i != min) swap(v[i], v[min]);}}
2.4 快速排序
- 选取第一个数为基准
- 将比基准小的数交换到前面,比基准大的数交换到后面
对左右区间重复第二步,直到各区间只有一个数
void quickSort(vector<int>& v, int low, int high) {if (low >= high) // 结束标志return;int first = low; // 低位下标int last = high; // 高位下标int key = v[first]; // 设第一个为基准while (first < last){// 从后往前,将比第一个小的移到前面while (first < last && v[last] >= key)last--;if (first < last)v[first++] = v[last];// 从前往后,将比第一个大的移到后面while (first < last && v[first] <= key)first++;if (first < last)v[last--] = v[first];}// 基准置位v[first] = key;// 前半递归quickSort(v, low, first - 1);// 后半递归quickSort(v, first + 1, high);}
3 应用场景[3]
- 规模较小:插入、选择
- 规模较大:快排、堆排序、归并
- 文件初始状态基本有序:插入、冒泡、快排
