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