/*------------------------------------------------------------------------------------------------
折半排序法(二分插入排序法)
排序原理:其实也属于插入法类型,分已排序和未排序部分.然后将未排序
部分元素逐个排序插入,但是插入的过程不同,需要每次求一个
中间位置,和中间位置元素比较大小,然后根据大小情况,将高位
左移或者将低位右移,再求中间元素比较,直到找到合适位置后,
将其后已排序元素全部后移一位,再插入该匀速即可.此方法中
每步打印的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];
- 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,high] = [0,i-1],第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); ,low总比high小于1
- for(j=i-1;j>high;j--)
- ar[j+1]=ar[j];
- ar[high+1]=temp;
- }
- }