欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

插入排序

程序员文章站 2022-06-04 18:06:42
...

插入排序:每次将一个待排序的记录,插入到前面已经排好序的子表的适当位置,直到全部记录插入完毕。
插入排序
有点像我们打牌时,每拿一张牌就插入到适当的位置。
我们可以将全部记录分成两组:一组已经排好序,剩余的未排序,依次将未排序的元素插入到前面已经排好序的子组内。
插入排序
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
    //index: [i, i+1, i+2, ...] : unsorted part
    for (i=1; i<count; i++)
    {
       //tmp:  空间复杂度用到的唯一空间 
        int tmp = data[i];
        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):在正确的位置插入;

相关标签: 插入排序