常用算法的特點總結:
排序算法 | 平均時間複雜度 | 最好情況 | 最壞情況 | 空間複雜度 | 排序方式 | 穩定性 |
---|---|---|---|---|---|---|
冒泡排序 | 內排序 | 穩定 | ||||
選擇排序 | 內排序 | 不穩定 | ||||
插入排序 | 內排序 | 穩定 | ||||
希爾排序 | 內排序 | 不穩定 | ||||
歸併排序 | 內排序 | 穩定 | ||||
快速排序 | 內排序 | 穩定 | ||||
堆排序 | 內排序 | 穩定 | ||||
計數排序 | 內排序 | 穩定 | ||||
桶排序 | 內排序 | 穩定 | ||||
基數排序 | 內排序 | 穩定 |
插入排序:
向一個有序數組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;
}
}
}