| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1154 人关注过本帖
标题:这样为什么没法进行折半排序
只看楼主 加入收藏
Superstone
Rank: 1
来 自:江苏
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-7-21
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:4 
这样为什么没法进行折半排序
int main(int argc, const char *argv[])
{
    int a[10]={10,25,36,69,78,95,45,34,24,16};
    int i,j,k,n;
    int m=0;
    int num;
    for(k=1;k<10;k++)
    {
        num=a[k];
        i=0;
        j=k-1;
        printf("num:%d\n",num);
        while(i<j)
        {
            m=(i+j)/2;
            if(num>a[m])i=m+1;
            else if(num<a[m])j=m-1;
        }
    printf("i:%d\nj:%d\n",i,j);
        for(n=k;n>j;n--)
            a[n]=a[n-1];
        a[j+1]=num;
    }
    for(i=0;i<10;i++)
        printf("%4d",a[i]);
        printf("\n");
2016-08-09 11:39
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:7 

程序代码:
int main(int argc, const char *argv[])
{
    int a[10]={10,25,36,69,78,95,45,34,24,16};
    int i,j,k,n;
    int m=0;
    int num;
    for(k=1;k<10;k++)
    {
        num=a[k];
        i=0;
        j=k-1;
        printf("num:%d\n",num);
        while(i<j)//这是个死循环,永远跳不出的。。。
        {
            m=(i+j)/2;
            if(num>a[m])i=m+1;
            else if(num<a[m])j=m-1;
        }
    printf("i:%d\nj:%d\n",i,j);
        for(n=k;n>j;n--)
            a[n]=a[n-1];
        a[j+1]=num;
    }
    for(i=0;i<10;i++)
        printf("%4d",a[i]);
        printf("\n"); 

不知道楼主讲的折半排序是什么?我目前接触过的算法好像没这个名字的。不知道楼主的排序原理是什么样的?看你的节奏从前往后拿第一个和未排序数组的中间位置作比较交换,可是,,这样交换的结果是令哪个元素有序?是前面的还是后面的?


φ(゜▽゜*)♪
2016-08-09 13:04
FQYB
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:43
专家分:130
注 册:2016-7-29
收藏
得分:7 
是折半插入排序吧,在插入排序查找有序部分的地方用上折半查找,加快算法速度
2016-08-09 14:47
FQYB
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:43
专家分:130
注 册:2016-7-29
收藏
得分:0 
写代码要养成把代码写得清晰易懂的习惯,重要的地方写注解
代码写得挤在一块,别人一看就没有欲望去理解了
你代码我改了一下看看吧
  1 #include <stdio.h>
  2
  3 int main(int argc, const char *argv[])
  4 {
  5         int a[10] = {10,25,36,69,78,95,45,34,24,16};
  6         int i, j, k, n;
  7         int m = 0;
  8         int num;
  9         for (k = 1; k < 10; k++)
 10         {
 11                 num = a[k];
 12                 i = 0;
 13                 j = k - 1;
 14                 printf("num:%d\n", num);
 15                 while(i <= j)
 16                 {
 17                         m = (i + j) / 2;
 18                         if (num > a[m])
 19                                 i = m + 1;
 20                         else if ( num < a[m])
 21                                 j = m - 1;
 22                 }
 23                 printf("i:%d\nj:%d\n",i,j);
 24                 for (n = k; n > i; n--)
 25                         a[n] = a[n-1];
 26                 a[i] = num;
 27         }
 28
 29         for(i=0;i<10;i++)
 30                 printf("%4d", a[i]);
 31         printf("\n");
 32
 33         return 0;
 34 }
gcc编译成功


[此贴子已经被作者于2016-8-9 15:25编辑过]

2016-08-09 15:22
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:7 
一般的冒泡就可以解决的问题,数据量又不是很大就不用插入排序了

我不是砖家,要努力成为砖家。
2016-08-09 16:20
快速回复:这样为什么没法进行折半排序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015735 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved