前面已经写过一篇插入排序,是属于直接插入排序,其算法简便,且容易实现,当待排记录的数量n很小时,这是一种很好的排序方法,但是,通常待排序序列中的记录数量n很大,则不宜采用直接插入排序。
由于插入排序的基本操作是在一个有序表中进行查找和插入,则这里的查找就可以利用一系列的查找算法来实现,从而减少查找的次数,今天先采用最简单的“折半查找算法”来实现。
主要步骤:
1. 折半查找插入位置。
2. 相应元素后移。
3. 将待插入元素插入到查找到的位置。
//折半插入排序
void Binsert_sort(ElemType array[],int length){
int inner,outer,i;
int temp,position;
int low,high,median;
if(array == NULL || length == 0)
exit(-1);
for(outer = 1; outer < length ;outer++){
//取出待插入元素
temp = array[outer];
low = 0;
high = outer - 1;
//查找插入位置
while(low <= high){
median = (low + high) >> 1;
if(array[median] < temp)
low = median + 1;
else
high = median - 1;
}
position = low;
//相应元素后移
i = outer;
while(i > position){
array[i] = array[i-1];
i--;
}
//将待插入元素插入到position
array[position] = temp;
}
}
其实,就是在原来直接插入排序的基础上修改查找算法。