由于此博文并不难,所以并不需要搬出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 << " 排序后:"; 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 }