/*------------------------------------------------------------------------------------------------
折半排序法(二分插入排序法)
排序原理:其实也属于插入法类型,分已排序和未排序部分.然后将未排序
折半排序法(二分插入排序法)
排序原理:其实也属于插入法类型,分已排序和未排序部分.然后将未排序
部分元素逐个排序插入,但是插入的过程不同,需要每次求一个
中间位置,和中间位置元素比较大小,然后根据大小情况,将高位
左移或者将低位右移,再求中间元素比较,直到找到合适位置后,
将其后已排序元素全部后移一位,再插入该匀速即可.此方法中
每步打印的high和low关系应为high+1=low
-----------------------------------------------------------------------------------------------*/#include<stdio.h>
void Half_Sort(int ar[],int len);
int main(void)
{
int i,n;
puts("Input the number of elements to the array:");
scanf("%d",&n);
int ar[n]; //变长数组,n要在声明之前得到
printf("Input %d elements of the array:\n",n);
for(i=0;i<n;i++) //读取数组元素
scanf("%d",&ar[i]);
Half_Sort(ar,n);
printf("ar[%d] = ",n);
for(i=0;i<n;i++) //逐个打印数组元素
printf("%d ",ar[i]);
putchar('\n');
return 0;
}
void Half_Sort(int ar[],int len)//折半排序
{
int i,j,temp,low,mid,high;
for(i=1;i<len;i++) //最开始第一个元素仍然被看作已经排好的部分
{
low=0; //最低位置
temp=ar[i]; //要插入的元素,已经排好序的最高位的下一位元素
high=i-1; //最高位置
while(low<=high)
{
mid=(low+high)/2; //折中,取中间位置
if(ar[mid]>temp) //判断要插入的元素和中间元素的大小
high=mid-1; //中间元素大,最高位置取当前中间位置的前一位,重新再求中间位置
else
low=mid+1; //中间元素小,最高位置取当前中间位置的后一位,重新再求中间位置
}
printf("hight =%3d low =%3d\n",high,low);//查看每次寻找到位置后的高位和低位的位置
for(j=i-1;j>high;j--) //将(high+1)~i的所有元素后移一位
ar[j+1]=ar[j];
ar[high+1]=temp; //插入元素
}
}