折半插入排序(C语言)
折半插入排序
1.排序原理
利用折半查找的方法来查找插入的位置,然后再直接将需要插入的数据插入该位置即可
<mark>排序过程</mark>
以从小到大排序为例,首先用key存储需要排序的数据
第一步:折半查找——用low、mid、high划分两个区域【low,mid-1】和【mid+1,high】
第二步:判断——如果key值小于序列的中间值【mid】,则代表key值应该插入左边的区域【low,mid-1】,然后对【low,mid-1】再重复划分区域,直到low>high为止
第三步:插入——最后的插入位置应该是high+1,我们只需要先将high之后位置的数据整体后移,然后将key赋值给【mid+1】,即完成插入。
<mark>如图</mark>
2.源代码:
#include<stdio.h>
void BInsertSort(int num[],int N)
{
int i,j,low,high,mid,key;
for(i=1;i<=N;i++)
{
key=num[i];
low=0;
high=i-1;
while(low<=high)//折半查找
{
mid=(low+high)/2;
if(num[mid]>key)
high=mid-1;//如果大于key值,则查找范围缩小到左子序列
else
low=mid+1;//如果小于key值,则查找范围缩小到右子序列
}
for(j=i-1;j>=high+1;j--)
num[j+1]=num[j];//将high之后的数据整体后移
num[high+1]=key;//将key值插入该位置
}
}
int main()
{
int num[10]={9,8,7,6,5,4,3,2,1,0};
BInsertSort(num,10);
for(int i=0;i<10;i++)
printf("%d ",num[i]);
printf("\n");
return 0;
}