基本思想
把n個元素的數列分成有序(前)和無序(后)的兩部分
{{a1},{a2,a3,a4,…,an}} {{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}} … {{a1(n-1),a2(n-1) ,…},{an(n-1)}}
每次處理就是將無序的數列中第一個元素與有序數列的元素從后到前比較,找到插入位置,將該元素插入到有序數列的適當的最終的位置上(穩定排序)。
參考代碼一
#include <iostream> #include <cstdlib> using namespace std; void insertSort(int array[], int size) { for(int i = 1; i < size; ++i) { for(int j = i; j > 0 && array[j-1] > array[j]; --j) { int tmp = array[j]; array[j] = array[j-1]; array[j-1] = tmp; } } } int main() { int a[] = {1, 3, 5, 7, 8}; size_t size = sizeof(a) / sizeof(int); insertSort(a, size); for(int i = 0; i < size; ++i) cout << a[i] << " "; cout << endl; }
連續交換的時候相當於整體后移,把做比較元素放到最終位置上,修改如下。
參考代碼二
#include <iostream> #include <cstdlib> using namespace std; void insertSort(int array[], int size) { for(int i = 1; i < size; ++i) { int tmp = array[i]; int j; for(j = i; j > 0 && array[j-1] > array[j]; --j) array[j] = array[j-1]; array[j] = tmp; } } int main(int argc, char **argv) { int a[] = {1, 3, 5, 7, 8}; size_t size = sizeof(a) / sizeof(int); insertSort(a, size); for(int i = 0; i < size; ++i) cout << a[i] << " "; cout << endl; }
運行結果
1 3 5 7 8
分析
空間:僅需要一個輔助空間,為O(1)
時間:對數列進行升序排列,最好情況——已經是升序了,比較次數為(n-1)次;最壞情況——已經是降序了,比較次數為(n-1)*n/2,賦值操作為(n-1)*n/2 + (n-1)。
平均來說插入排序算法復雜度為O(n2)。因而,插入排序不適合對於數據量比較大的排序應用。但是,如果需要排序的數據量很小,例如,量級小於千,那么插入排序還是一個不錯的選擇。 插入排序在工業級庫中也有着廣泛的應用,在STL的sort算法和stdlib的qsort算法中,都將插入排序作為快速排序的補充,用於少量元素的排序(通常為8個或以下)。