由於此博文並不難,所以並不需要搬出C++特性的這些大山,所以就使用簡單的C++代碼描述了。^_^
直接插入排序是一種簡單的插入排序法,所以適用於少量數據的排序,直接插入排序是比較穩定的一種排序算法。
其基本思想是:把待排序的紀錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的紀錄插入完為止,得到一個新的有序序列。
插入排序:時間復雜度O(n^2)
直接插入排序是屬於In-place sort(不占用額外內存或占用常數的內存),所以空間復雜度為O(1)。上一篇的冒泡排序同樣如此
In-place sort的優點在於,當需要大量數據排序時,占用內存非常少。
步驟大概是這樣的:
1.從第一個元素開始,該元素可以認為已經被排序 代碼中 key = arr[i];就是這個意思
2.取出下一個元素,在已經排序的元素序列中從后向前掃描
3.如果該元素(已排序)大於新元素,將該元素移到下一位置
4.重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
5.將新元素插入到該位置后
6.重復步驟2~5
下面的圖是動畫演示,同樣是從度娘那兒討來的,畢竟自己不會做這種圖。。。。

1 #include <iostream> 2 3 using namespace std; 4 6 //// 寫法1 7 void insertSort_0(int arr[], int length) 8 { 9 int i, j, key; 10 for (i = 1; i < length; i++){ 11 key = arr[i]; 12 for (j = i - 1; j >= 0; j--){ 13 if (arr[j] > key) { 14 arr[j + 1] = arr[j]; 15 } 16 else 17 break; 18 } 19 arr[j + 1] = key; 20 } 21 } 22 23 //// 寫法2 24 void insertSort_1(int arr[], int length) 25 { 26 int j, key; 27 for (int i = 1; i < length; i++){ 28 key = arr[i]; 29 j = i - 1; 30 while (j >= 0 && arr[j] > key){ 31 arr[j + 1] = arr[j]; 32 j--; 33 } 34 arr[j + 1] = key; 35 } 36 } 37 38 39 40 int main() 41 { 42 int iArr[] = { 7, 8, 9, 5, 2, 0, 12, 6 }; 43 int len = sizeof iArr / sizeof(iArr[0]); 44 45 cout << "排序前:"; 46 for (int i = 0; i < len; i++) { 47 cout << iArr[i] << " "; 48 } 49 50 cout << "\n排序后:"; 51 insertSort_0(iArr, len); 52 for (int j = 0; j < len; j++) { 53 cout << iArr[j] << " "; 54 } 55 cout << endl; 56 57 system("pause"); 58 return 0; 59 }
