常用算法的特点总结:
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 排序方式 | 稳定性 |
---|---|---|---|---|---|---|
冒泡排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 内排序 | 稳定 |
选择排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 内排序 | 不稳定 |
插入排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 内排序 | 稳定 |
希尔排序 | O ( n 1.3 ) O(n^{1.3}) O(n1.3) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 内排序 | 不稳定 |
归并排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 内排序 | 稳定 |
快速排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 内排序 | 稳定 |
堆排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 内排序 | 稳定 |
计数排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 内排序 | 稳定 |
桶排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 内排序 | 稳定 |
基数排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 内排序 | 稳定 |
插入排序:
向一个有序数组a[n]中插入一个新元素x,使得新的数组a[n+1]依然是一个有序数组;
算法实现思路:
1、找到新元素x在有序数组a[n]中的大小位置:从有序数组a[0]开始循环,与x比较大小,当x小于数组中的值时,停止循环,记录数组下标index;
2、将数组中大于x的数全部向后移动一个单位的长度;
3、将新元素插入index所在的位置;
代码实现:
void insert_sort(int a[], const int n) {
for (int i = 1; i < n; i++) {
int temp = a[i];
int j = i - 1;
for (; j >= 0 && a[j] > temp; j--) {
a[j + 1] = a[j];
}
a[j + 1] = temp;
}
}
上述代码来自极客时间专栏《数据结构与算法之美》的第11节。
插入排序算法的实现有很多种,每个人的实现方式都不尽相同,但上述这种是目前已知代码比较简洁,效率较高的一种实现;
冒泡排序
依次比较相邻两个元素的大小,若前面的元素较大,则交换两个元素的位置,否则不交换。
代码实现
void bubble_sort(int a[], const int n) {
for(int j = 0; j < n; j++) {
int swap_flag = 0;
for (int i = 0; i < n - 1; i++) {
if (a[i] > a[i + 1]) {
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
swap_flag = 1;
}
}
if(swap_flag == 0) {
break;
}
}
}
希尔排序
void shell_sort(int a[], const int n) {
for(int k = n / 2; k > 0; k /= 2) {
for (int i = k; i < n; i++) {
int temp = a[i];
int j = i;
for (; j >= k && a[j - k] > temp; j-= k) {
a[j] = a[j-k];
}
a[j] = temp;
}
}
}