介紹
插入排序是一種時間複雜度爲O(n2)級別的排序算法。那麼爲什麼我們還要學習時間複雜度爲O(n2)級別的算法呢?因爲在有的時候插入排序反而更快,比如對一個近乎有序的數組或者元素值的波動範圍比較小的情況下,插入排序有天然的優勢。插入排序的思想也可以應用到更高級別的算法中,能夠幫助我們進一步優化排序。
具體思路
- 設定一個索引值 i,索引到第2個元素的位置。
- 再設定一個索引值 j,使 j = i 。再讓當前 j 索引的元素與其前一個元素比較,如果不符合需要排定的順序,就交換,直到滿足需要排定順序的要求。
- 以此類推,直到把之後的元素都遍歷完。
代碼實現
下面用C++實現一個基本的插入排序算法:
#include<bits/stdc++.h>
using namespace std;
template<class T>
void insertionSort(T arr[], int n) {
//從第二個元素開始
for(int i = 1; i < n; i++) {
for(int j = i; j > 0; j--) {
//依次與前一個元素比較
if(arr[j-1] > arr[j])
swap(arr[j-1], arr[j]);
}
}
return;
}
int main(int argc, char const *argv[])
{
// 測試
int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
insertionSort(arr, 10);
for(int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
優化
很多時候我們都需要對我們的代碼進行優化,上面的代碼也有可以優化的地方。這是我寫的一個優化的插入排序。
#include<bits/stdc++.h>
using namespace std;
template<class T>
void insertionSortAd(T arr[], int n) {
//從第二個元素開始
for(int i = 1; i < n; i++) {
//備份當前值
T temp = arr[i];
int j;
for(j = i; j > 0 && arr[j-1] > temp; j--) {
//當前面的元素不滿足排序要求,覆蓋到後面的位置,直到滿足排序要求
arr[j] = arr[j-1];
}
//此時 j 所在的位置就是temp該在的位置
arr[j] = temp;
}
return;
}
int main(int argc, char const *argv[])
{
// 測試
int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
insertionSortAd(arr, 10);
for(int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
省去了頻繁交換對時間的影響。
最後
- 由於博主水平有限,難免有疏漏之處,歡迎讀者批評指正!