直接插入排序

        直接插入排序的思路是这样的:假设前i个数已经排好,将第i+1个数依次和前面的数进行比较,如果array[i+1]小于array[j],则将array[i+1]插入到array[j]的前面,插入过程是这样的,将array[i+1]储存到tmp中,然后array[j]到array[i]之间的数后整体后移一位,然后将tmp中的值赋给array[j]。代码如下:

void InsertSort(int Array[], int k)
{
	int i;
	int j;
	int n;
	int tmp;
	for(i = 0; i <=k-2; ++i)
		for(j = 0; j <=i; ++j)
		{
			if(Array[i+1] < Array[j])
			{
				tmp =Array[i+1];
				for(n = i ; n>=j; --n)
					Array[n+1] = Array[n];
				Array[j] = tmp;
				break;
			}
		}
}

         分析下上面的代码,每次循环开始时,前面已经排好序的数和当前的数都要一一进行比较,如果当前的数大于前面排好的序列的最大的数,那么这个比较就显得很多余了,所以上面的算法实现效率是比较低的。下面是改进的插入排序

void InsertSortIpr( int Array[ ], int k)

{

         int i; 

        int j;

        int tmp;

         for(i = 0; i <= k-2; ++i)

            if(Array[i+1]< Array[i])

            {

                 tmp = Array[i+1];

                 for(j = i; Array[j] > tmp&&j>=0; --j)

                         Array[j+1] = Array[j ];

                Array[j+1] = tmp;

            }

}  


      时间复杂度:

    最好情况:

   排好序了已经,n

   最坏情况: o(n^2),直接插入法比冒泡法和简单的选择排序发效率要高些。

   空间复杂度:常数


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值