折半排序法(二分插入排序法)

来源:互联网 发布:web聊天室源码 编辑:程序博客网 时间:2024/05/16 01:56
/*------------------------------------------------------------------------------------------------
                                 折半排序法(二分插入排序法)
排序原理:其实也属于插入法类型,分已排序和未排序部分.然后将未排序

                 部分元素逐个排序插入,但是插入的过程不同,需要每次求一个

                 中间位置,和中间位置元素比较大小,然后根据大小情况,将高位

                 左移或者将低位右移,再求中间元素比较,直到找到合适位置后,

                 将其后已排序元素全部后移一位,再插入该匀速即可.此方法中

                 每步打印的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;     //中间元素大,最高位置取当前中间位置的前一位,重新再求中间位置elselow=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;        //插入元素}}

原创粉丝点击