一、算法描述
插入排序是一种常用的计算机算法,对于少量元素的排序是个比较有效的算法。它的基本思想是:仅有一个元素的序列总是有序的,因此,对n个记录的序列,可从第二个元素开始直到第n个元素,逐个向有序序列中执行插入操作,第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。从而得到n个元素按关键字有序的序列。一般来说,在含有j-1个元素的有序序列中插入一个元素的方法是:从第j-1个元素开始依次向前搜索应当插入的位置,并且在搜索插入位置的同时可以后移元素,这样当找到适当的插入位置时即可直接插入元素。其主要的排序步骤:
二、算法实现
template <class T> void Insert(T& a, int len) { for(int j = 1; j < len; j++) { T key = a[j]; int i = j - 1; while (i >= 0 && a[i] > key) { a[i + 1] = a[i]; i--; } a[i + 1] = key; } }
三、算法分析
空间复杂度:占用的内存为常数个内存单元,因此其空间效率为O(1)。
时间复杂度:在给定规模的输入下,其时间复杂度依赖于给定的输入情况。
当输入数组已经排序好的话,会出现最佳情况。此时,内层while循环判定不成立而终止,总的比较次数为n-1,移动次数为0,此时为O(1)。
若数组是按照逆序排列的,那么就会出现最坏的情况。此时,比较和移动次数都达到最大,为O(n2)。
稳定性:该算法是一个稳定的算法。