插入排序
经典排序算法 – 插入排序Insertion sort
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。
图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入。
1 #include <iostream> 2 3 using namespace std; 4 5 /* 插入排序 6 * 从小到大排序 7 */ 8 void insertSort(int arr[]) 9 { 10 int n = 9; 11 int i,j,target; 12 for(i=1; i<n; i++){ 13 j = i; 14 target = arr[i]; 15 while( j>0 && target<arr[j-1]){ 16 arr[j] = arr[j-1]; //有序数组往后平移 17 j--; 18 } 19 arr[j] = target; //将数插入到有序序列中 20 } 21 } 22 23 int main() 24 { 25 int arr[] = {2,1,5, 7,3,8, 1,0,9}; 26 int length = 9; 27 28 insertSort(arr); 29 for(int i=0; i<9; i++){ 30 cout << arr[i] << " "; 31 }cout << endl; 32 return 0; 33 }
效率分析
稳定性: 稳定
空间复杂度: O(1)
时间复杂度: O(n^2)
最差情况: 反序, 时间复杂度: O(n^2), 需要移动n*(n-1)/2个元素,
最好情况: 正序,时间复杂度:O(n), 不需要移动元素
插入排序最坏情况运行时间和平均情况运行时间都为O(n2)。
对于具有较少元素(如n<=15)的列表来说,二次算法十分有效。
在列表“近似排序”时,插入排序仍然是线性算法。
在列表的许多元素已位于正确的位置上时,就会出现“近似排序”的条件。
通过使用O(nlog2n)效率的算法(如快速排序)对数组进行部分排序,
参考博文: http://www.cnblogs.com/fanyong/archive/2012/03/23/2413553.html