| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8840 人关注过本帖
标题:求一个C程算法——折半查找法
只看楼主 加入收藏
hxw84
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-2-21
收藏
得分:0 

看了上面大哥的程序,受益匪浅,觉得像我现在的水平可以看懂学会,但是要是以前的我看起来比较困难。所以我综合了一下前面的优点重写了一个程序,最重要的是添加了好多注释,如果编程新手们感兴趣的,仔细看看,我觉得这个程序挺综合的,好多常用的东西可以学习。高手就不要看了,会笑的

//==============================================
//本程序的更能介绍:
//1.先用srand和rand函数生成0-99之间的随机数10个
//2.再用冒泡排序将随机数排序
//3.用折半查找定位用户所输入的数字
//==============================================
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10

typedef struct
{
int pos; //pos是编号,num是数据。排序完成每一项在数组中的位置发生了变化,但是编号没有变化
int num; //所以可以保证查找返回的数字的编号就是原始数组中的编号
}code;

void main(void)
{
void bubble_sort(code array[]); //函数声明,冒泡排序
int binary_search(code array[],int search); //折半查找
int i,position,number; //position为查找完成以后返回的数字在数组中位置,number是用户输入的要查找的数字
code array[N];
//生成10个随机数填充数组
srand((unsigned)time(NULL)); //生成随机数发生的种子
for(i=0;i<10;i++)
{
array[i].pos=i+1;
array[i].num=rand()%100; //生成随机数
}
for(i=0;i<10;i++) //输出原始数组中的编号和数字对应
{
printf("%2d %d\n",array[i].pos,array[i].num);
}

//折半查找以前要给数组排序
bubble_sort(array);

//显示排序完成后的结果的,开启注释以后可以看见
// for(i=0;i<10;i++)
// {
// printf("%2d %d\n",array[i].pos,array[i].num);
// }
//让用户输入要查找的数字
printf("Please input the number which you want to search:\n");
scanf("%d",&number);

//折半查找
position=binary_search(array,number);
//输出
if(position==-1) printf("The number you entered is not in the array!"); //查找失败的输出
else
printf("Position of the number is %d\nThe value is %d",array[position].pos,array[position].num);
//查找成功返回编号(就是原始数组中的位置)和数据
}

//冒泡排序函数
void bubble_sort(code array[])
{
int temp,i,j;
for(i=0;i<10;i++) //一共要做10趟,每趟保证可一把最大的数放到最后
for(j=0;j<10-i-1;j++) //每趟将从0~10-i-1之间每两个数相互比较,共比较10-i次
{
if(array[j].num>array[j+1].num) //前面的比后面的大,就交换
{
temp=array[j].num;
array[j].num=array[j+1].num;
array[j+1].num=temp;
temp=array[j].pos; //注意pos也要变换,表示该数字以前的位置呀
array[j].pos=array[j+1].pos;
array[j+1].pos=temp;
}
}
}
//折半查找函数
int binary_search(code array[],int search)
{
int middle,front=0,rear=9;
while(front<=rear) //这是算法的关键,判断查找成功失败的条件,建议仔细理解,找个算法书上的图示看看
{
middle=(front+rear)/2;
if(search==array[middle].num) return middle; //查找成功,返回middle即是要查数据在新数组中的位置
else if(search>array[middle].num) front=middle+1; //暂时没有找到的情况
else rear=middle-1;
}
if(front>rear) return -1; //查找失败返回-1
}

[此贴子已经被作者于2007-4-13 19:22:36编辑过]


这个论坛上任何喜欢和俺交流的人俺都欢迎您加俺 qq:61997030
2007-04-13 19:19
alading664
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-1-25
收藏
得分:0 

#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
void bubble_sort(code array[])
{
int temp,i,j,min;
for(i=0;i<9;i++)
{
min=i;
for(j=i+1;j<10;j++)
if(array[min]>array[j])
min=j;
SWAP(array[i].pos,array[min].pos,temp);
SWAP(array[i].num,array[min].unm,temp);
}
}

2007-04-14 00:22
ludeng
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-4-12
收藏
得分:0 
应该先排序把
2007-04-14 09:12
zhaoyg
Rank: 1
等 级:新手上路
帖 子:328
专家分:0
注 册:2006-8-28
收藏
得分:0 
哈哈,昨天中午刚做完这个练习

麻雀飞上枝头变凤凰,而菜鸟的我飞上枝头却感冒了,为什么我的脑袋如此的不管用呢。
2007-04-14 10:46
么么
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-6-13
收藏
得分:0 

折半的前提是有序

2007-06-13 14:44
liuyicun
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-5-24
收藏
得分:0 
回复:(hyln)[分享]
为什么要记录初始位置啊?
2007-06-13 16:01
快速回复:求一个C程算法——折半查找法
数据加载中...
 
   



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

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