1、插入排序的基本思想:在一个已经排好的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好的记录子集中,直到将所有待排记录全部插入为止。例如,打扑克牌时的抓牌就是一个很好的例子,每抓一张牌,插入到合适的位置,直到抓完牌为止,即可得到一个有序的序列。
2、直接插入排序的算法思想:其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。
插入排序:时间复杂度O(n^2)
直接插入排序是属于In-place sort(不占用额外内存或占用常数的内存),所以空间复杂度为O(1)。上一篇的冒泡排序同样如此
In-place sort的优点在于,当需要大量数据排序时,占用内存非常少。
步骤大概是这样的:
1.从第一个元素开始,该元素可以认为已经被排序 代码中 key = arr[i];就是这个意思
2.取出下一个元素,在已经排序的元素序列中从后向前扫描
3.如果该元素(已排序)大于新元素,将该元素移到下一位置
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5.将新元素插入到该位置后
6.重复步骤2~5
C描述:
#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 = 0; 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 }