插入排序
程序员文章站
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):在正确的位置插入;
上一篇: 插入排序