| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1753 人关注过本帖
标题:好久没发贴了,发个二分法查找,插入排序的程序,高手看了请指点不足,兄弟先谢 ...
只看楼主 加入收藏
mqh21364
Rank: 1
等 级:新手上路
帖 子:642
专家分:0
注 册:2008-2-28
收藏
 问题点数:0 回复次数:7 
好久没发贴了,发个二分法查找,插入排序的程序,高手看了请指点不足,兄弟先谢谢了!!!
/*
 程序目的:用二分法来查找一个数据在给定数组中出现的位置
 */
#include <stdio.h>
#define MAX 10
void sort(int *a);

void print_arr(int *a, int len);

int search(int *a, int n);

int main(void)
{
    int a[10], i, n;
    printf("Please input 10 numbers:\n");
    for (i=0; i<MAX; i++)
    {
        if (scanf("%d", &a[i]) == 0)
        {
            printf("Your input is not a number!");
            exit(1);
        }
    }
    sort(a);
    printf("Please input the number you want to search:\n");
    scanf("%d", &n);
    if (search(a, n) == 1)
    {
        printf("The searched number is in the list!!\n");
    }
    else
    {
        printf("The searched number is not in the list!!\n");
    }
    return 0;
}

/*
 @功能:将数组a按升序进行排序(用插入排序法)。
 @输入:整型数组a.
 @返回:无。
 */
void sort(int a[])
{
    int j, k, m;
    /*从第2个数字开始,依次读取数字*/
    for (j=1; j<MAX; j++)
    {
        m=j-1;
        k=a[j];
        /*将大于新数字的数字全部后移1位*/
        while (a[m]>k&&m>=0)
        {
            a[m+1]=a[m];
            m--;
        }
        a[m+1]=k;
        
    }
}

/*
 @功能:将数组a打印出来。
 @输入:整型数组a,长度len.
 @返回:无。
 */
void print_arr(int *a, int len)
{
    int i;
    for (i=0; i<len; i++)
    {
        printf("%d  ", a[i]);
    }
    printf("\n");
}
/*
 @功能:查找n是否存在于数组a中。
 @输入:整型数组a,整数n.
 @返回:存在,返回1;不存在,返回0。
 */
int search(int *a, int n)
{
    int i, start=0, end=MAX-1, middle=0 ,k=0;
    /*因为这里数组是经过排序的,所以小于最小的和大于最大的输入一定不在该数组中,
    直接返回,避免浪费时间。*/
    if (n<a[start]||n>a[end])
    {
        return 0;
    }
    /*利用3个下标来完成二分法的查找*/
    while (start!=end)
    {
        middle=(start+end)/2;
        /*根据不同的情况,重置start,end的位置*/
        if (a[middle] == n)
        {
            return 1;
        }
        if (a[middle]>n)
        {
            end=middle;
        }
        if (a[middle]<n)
        {
            start=middle;
        }
    }
    return 0;
}

这个就是我的程序.高手看了要是发现有什么不足,请不吝赐教.兄弟我先谢谢了!!
搜索更多相关主题的帖子: 二分法 兄弟 
2008-04-28 15:25
mqh21364
Rank: 1
等 级:新手上路
帖 子:642
专家分:0
注 册:2008-2-28
收藏
得分:0 
没有人回................................

前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。
2008-04-29 10:44
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
你的二分是不是死循环?

" border="0" />[color=white]
2008-04-29 11:03
mqh21364
Rank: 1
等 级:新手上路
帖 子:642
专家分:0
注 册:2008-2-28
收藏
得分:0 
不是,我运行过的.

前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。
2008-04-29 11:30
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
你只测试过一组??

" border="0" />[color=white]
2008-04-29 12:02
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
#include <stdio.h>
#include<stdlib.h>
#define MAX 10
void sort(int *a);

void print_arr(int *a, int len);

int search(int *a, int n);

int main(void)
{
    int a[MAX], i, n;
    printf("Please input 10 numbers:\n");
    for (i=0; i<MAX; i++)
    {
        if (scanf("%d", &a[i]) == 0)
        {
            printf("Your input is not a number!");
            exit(1);
        }
    }
    sort(a);
    print_arr(a,MAX);
    printf("Please input the number you want to search:\n");
    do{
       if (search(a, n) == 1)
    {
        printf("The searched number is in the list!!\n");
    }
    else
    {
        printf("The searched number is not in the list!!\n");
    }
    }
    while(scanf("%d", &n)!=EOF);
    return 0;
}
void sort(int a[])
{
     for (int j=0; j<MAX-1; j++)
     for(int i=0;i<MAX-1;i++ )
    {
         if(a[i]>a[i+1])
         {
             int dem=a[i];
             a[i]=a[i+1];
             a[i+1]=dem;
         }
        
    }
}

void print_arr(int *a, int len)
{
    int i;
    for (i=0; i<len; i++)
    {
        printf("%d  ", a[i]);
    }
    printf("\n");
}
int search(int *a, int n)
{
    int  start=0, end=MAX-1, middle=0 ,k=0;
     if (n<a[start]||n>a[end])
    {
        return 0;
    }
   
    do{
        middle=(start+end)/2;
       if (a[middle] == n)
        {
            return 1;
        }
        if (a[middle]>n)
        {
            end=middle-1;
        }
        if (a[middle]<n)
        {
            start=middle+1;
        }
    }while (start<=end);
    return 0;
}

学习需要安静。。海盗要重新来过。。
2008-04-29 12:52
mqh21364
Rank: 1
等 级:新手上路
帖 子:642
专家分:0
注 册:2008-2-28
收藏
得分:0 
我倒....................
死循环了................

那么,我想问一下,二分法的结束条件应该是 start>end 而不是 start==end 啊???还有, 那个下标要定位到end=middle-1; end=middle-1; 啊???

不过我要谢谢燕子和 sunkaidong给我提出的宝贵意见!!!!!!!!!!!!!

预祝大家5.1快乐哦!!

[[it] 本帖最后由 mqh21364 于 2008-4-29 13:24 编辑 [/it]]

前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。
2008-04-29 13:21
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
还有,二分搜索失败不应该return 0;

" border="0" />[color=white]
2008-04-29 13:28
快速回复:好久没发贴了,发个二分法查找,插入排序的程序,高手看了请指点不足,兄弟 ...
数据加载中...
 
   



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

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