插入排序

一、算法描述

插入排序是一种常用的计算机算法,对于少量元素的排序是个比较有效的算法。它的基本思想是:仅有一个元素的序列总是有序的,因此,对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)。

稳定性:该算法是一个稳定的算法。

posted @ 2017-01-02 15:48  人形裁判爱丽丝  阅读(149)  评论(0编辑  收藏  举报