常用排序之插入排序法

来源:互联网 发布:python 哪方面的私活多 编辑:程序博客网 时间:2024/05/20 07:35
算法描述
何为插入排序呢?顾名思义,即向一个有序数据序列中插入一个数,插入此数后的序列仍然有序。


具体描述如下:

假如有一个数组:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中

⒍ 重复步骤2~5


对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P上的元素为已排序状态。插入排序利用了这样的事实:位置0到位置P-1上的元素是已排过序的。如下:


初始       34      8        64       51       32        21


p=1        8       34       64       51       32        21 


p=2        8       34       64       51       32        21 


p=3        8       34       51       64       32        21 


p=4        8       32       34       51       64        21 


p=5        8       21       32       34       51        64 


例程

#include<iostream>void InsertionSort(int a[], int n){int j, temp, p;for (p = 1; p < n; p++){temp = a[p];for (j = p; j > 0 && a[j - 1] > temp; j--)a[j] = a[j - 1];a[j] = temp;}}int main(){int b[] = { 9,8,19,4,6,2,3,7,4};InsertionSort(b,9);for (auto c : b)cout << c << " ";system("pause");}

时间复杂度分析

由于嵌套循环的每一个都花费N次迭代,因此插入排序为O(N^2)。

最好的情况是数组时有序排列的,每插入一个元素,只需考查前一个元素,此时的时间复杂度为O(n);

最坏的情况下,数组完全逆序,插入第2元素要考查前1个元素,插入第3个元素要考查前两个元素,.....,插入第N个元素,要考虑前N-1个元素。因此,最坏情况下的比较次数为1+2+3+...+n-1,结果为n^2/2,此时时间复杂度为O(n^2);

所以插入排序的平均时间复杂度为O(n^2);