开发者社区> 问答> 正文

请写一个折半插入排序算法(最好用C语言写出来,只要求写一个函数)

请写一个折半插入排序算法(最好用C语言写出来,只要求写一个函数)。

展开
收起
知与谁同 2018-07-19 12:17:50 1882 0
1 条回答
写回答
取消 提交回答
  • /***折半插入排序***/
    /*算法原理:从第二个数开始逐个置入监视哨,使用low,high标签在L[0..i-1]有序区内进行折半查找
    来确认待排序数的插入位置,然后将该位置到最后一个数全部后移一位,最后腾出该位置,
    把监视哨里面的数置入该位置。后面的数以此类推进行排序,直到最后一个数比较完毕。
    */
    #include<stdio.h>
    void binaryInsertSort(int L[],int n)
    {
    int i,j;
    int low,high,mid;
    //用L[0]作为监视哨,L[1..i-1]为有序区,
    for(i=2;i<=n;i++)
    {
    L[0]=L[i]; //待排序的数进监视哨
    low=1;
    high=i-1; //初始化low,high
    while(low<=high)//循环语句确定插入位置,必须保证low<=high
    {
    mid=(low+high)/2;
    if(L[0]<L[mid])//根据L[0]的值的大小,确定属于低半区还是高半区
    high=mid-1;//插入低半区//插入低半区
    else
    low=mid+1;//插入高半区
    }
    for(j=i-1;j>=high+1;j--)//待插入位置后面L[hign+1..i-1]全部数后移一位
    L[j+1]=L[j];
    L[high+1]=L[0]; //或者换成L[j+1]=L[0];监视哨里面的数插入数组
    }
    }

    void binaryInsertSort1(int L[],int n)
    {
    int i,j;
    int low,high,mid,tmp;
    //用临时变量tmp作为监视哨,L[0..i-1]为有序区
    for(i=1;i<n;i++)
    {
    tmp=L[i];
    low=0;
    high=i-1;
    while(low<=high)
    {
    mid=(low+high)/2;
    if(tmp<L[mid])
    high=mid-1;
    else
    low=mid+1;
    }
    for(j=i-1;j>=high+1;j--)
    L[j+1]=L[j];
    L[high+1]=tmp;
    }
    }

    int main()
    {
    int i,n;
    int a[50];
    printf("输入n= ");
    scanf("%d",&n);
    printf("输入数组元素:\n");
    // for(i=1;i<=n;i++)
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    // binaryInsertSort(a,n);
    binaryInsertSort1(a,n-1);
    printf("排序后;\n");
    // for(i=1;i<=n;i++)
    for(i=0;i<n;i++)
    printf("%-4d",a[i]);
    putchar(10);
    return 0;
    }
    2019-07-17 22:50:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载