插入排序

插入排序:每次将一个待排序的记录,插入到前面已经排好序的子表的适当位置,直到全部记录插入完毕。
这里写图片描述
有点像我们打牌时,每拿一张牌就插入到适当的位置。
我们可以将全部记录分成两组:一组已经排好序,剩余的未排序,依次将未排序的元素插入到前面已经排好序的子组内。
这里写图片描述
code 实现如下:

int insert_sort(int *data, unsigned int count)
{
    int i=0, j=0;
    if(NULL == data)
        return -1;

    //index: [0...j]: already sorted part, and j=i-1
    //index: [i, i+1, i+2, ...] : unsorted part
    for (i=1; i<count; i++)
	{
	   //tmp:  空间复杂度用到的唯一空间	
        int tmp = data[i];
        j = i-1;
	    while((j>=0) &&(d[j]>tmp))
		{
			//shift data
			d[j+1] = d[j];
			j--;
		}
        //insert data
        //note: j+1, not j     
        data[j+1] = tmp;
    }

    return 0;
}

这里写图片描述
优化:
折半插入排序:将无序区元素插入有序区时,采用折半插入方式。

int insert_sort_bisearch(int *d, unsigned int n)
{
    int i=0,j=0, tmp=0, low=0, high=0,mid=0;
    if(NULL==d)
        return -1;

    for(i=1; i<n; i++)
    {
        tmp = d[i]; 
        j = i-1;
        
        //bisearch: find the index in which will insert
        low = 0;
        high = j;
        while(low <= high)
        {
            mid = (low+high)/2;
            if( d[mid] > tmp ) 
                high = mid-1;
            else
                low = mid+1;
        }
           
        //shift data
        for(; j>=low; j--)
            d[j+1] = d[j]; 
        //insert
        d[low] = tmp;
    }

    return 0;
}

总结下插入排序 每轮 的2个重要步骤:

  1. 移位(shift): 有序区中较大的数据后移,为后序插入腾挪出空间;
  2. 插入(insert):在正确的位置插入;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值