永发信息网

用C语言编写顺序查找和二分查找(折半查找)

答案:3  悬赏:80  手机版
解决时间 2021-01-02 17:40
老师让我们做个实验报告可我们初学不会啊!!!希望大家可以帮个忙!!!要求就会是“同一组数据”分别用二分查找和顺序查找来做 要完整的程序,也就是可以运行的。
实验内容及要求:
该实验要求学生利用已学的查找算法,进行程序设计。主要是顺序查找和二分查找法的程序设计,通过对同一组实验数据的不同方法的查找,比较两种查找方法的时间复杂度
很急希望高手帮忙解决!!!谢谢了!!!!!

要能运行的啊

希望大家帮帮忙 这是我所有的分了啊
最佳答案
哎,我就辛苦辛苦了啦。

以下是可以编译运行的代码,在VC6.0下通过。

#include
#define LENGTH 20

void SequenceSearch(int *fp,int Length);
void Search(int *fp,int length);
void Sort(int *fp,int length);

void main()
{
int count;
int arr[LENGTH];

printf("请输入你的数据的个数:\n");
scanf("%d",&count);
printf("请输入%d个数据\n",count);
for(int i=0;i {
scanf("%d",&arr[i]);
}

int choise=0;
do
{
printf("1.使用顺序查询.\n2.使用二分查找法查找.\n3.退出\n");
scanf("%d",&choise);

if(choise==1)
SequenceSearch(arr,count);
else if(choise==2)
Search(arr,count);
else if(choise==3)
break;
} while (choise==1||choise==2||choise==3);
}

void SequenceSearch(int *fp,int Length)
{
int data;
printf("开始使用顺序查询.\n请输入你想要查找的数据.\n");
scanf("%d",&data);

for(int i=0;i if(fp[i]==data)
{
printf("经过%d次查找,查找到数据%d.\n",i+1,data);
return ;
}

printf("经过%d次查找,未能查找到数据%d.\n",i,data);
}

void Search(int *fp,int length)
{
int data;
printf("开始使用顺序查询.\n请输入你想要查找的数据.\n");
scanf("%d",&data);
printf("由于二分查找法要求数据是有序的,现在开始为数组排序.\n");
Sort(fp,length);
printf("数组现在已经是从小到大排列,下面将开始查找.\n");

int bottom,top,middle;

bottom=0;
top=length;

int i=0;
while (bottom<=top)
{
middle=(bottom+top)/2;
i++;
if(fp[middle] {
bottom=middle+1;
}
else if(fp[middle]>data)
{
top=middle-1;
}
else
{
printf("经过%d次查找,查找到数据%d.\n",i,data);
return;
}
}
printf("经过%d次查找,未能查找到数据%d.\n",i,data);
}

void Sort(int *fp,int length)
{
printf("现在开始为数组排序,排列结果将是从小到大.\n");

int temp;
for(int i=0;i for(int j=0;j if(fp[j]>fp[j+1])
{
temp=fp[j];
fp[j]=fp[j+1];
fp[j+1]=temp;
}

printf("排序完成!\n下面输出排序后的数组:\n");
for(int k=0;k {
printf("%5d",fp[k]);
}
printf("\n");

}

我粗略的测试了下,没有什么问题,有问题的话可以百度给我留言,当然,程序很容易,你可以自己修改。
全部回答
我这里有。。。 typedef int ElemType; //二分法查找 const ElemType* myFind(const ElemType* a,int n,const ElemType& e) { const ElemType* front=a,*rear=a+n-1,*mid; while(rear>=front) { mid=front+(rear-front)/2; if(e== *mid) return mid; else if(e>*mid) front=mid+1; else rear=mid-1; } return 0; } //递归描述二分法查找 const ElemType* myFind_dg(const ElemType* front,const ElemType* rear,const ElemType& e) { if(front>rear) return 0; const ElemType* mid=front+(rear-front)/2; if(e== *mid) return mid; else if(e>*mid) return myFind_dg(mid+1,rear,e); else return myFind_dg(front,mid-1,e); } 顺序查找,简单我就不说了,一个循环的事。
顺序查找:在一个已知无序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。复杂度为o(n). 二分查找又称折半查找,它是一种效率较高的查找方法。 【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。 【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 【算法复杂度】假设其数组长度为n,其算法复杂度为o(log(n)) #include //二分查找: int search(int a[],int x,int n) //x为要查找的元素,n为数组长度 { int mid=0; int low=0; int high=n; while(low<=high) { mid=(low+high)/2; if(a[mid]==x) { return mid; } else if(x void main() { int a[10]={1,2,3,4,5,6,7,8,9,10}; int i,x,y; printf("输入你要查找的数:\n"); scanf("%d",&x); y=0; //标记是否已找到,y=1表是找到了,y=0表示没找到 for(i=0;i<10;i++) //循环,把x和数组中的元素一个个比较 { if(x==a[i]) //如果x=a[i]说明已经找到 { y=1; //把y变成1,说明已经找到了 printf("你要查找的数%d在第个%d位置\n",x,i+1); //输出找到的相关信息 break; //跳出循环 } } if(y==0)printf("无法找到你要查找的数\n"); //y=0表示找不到 } int search(int a[],int x,int n) { int mid=0; int low=0; int high=n; while(low<=high) { mid=(low+high)/2; if(a[mid]==x) { return mid; } else if(x哎,我就辛苦辛苦了啦。 以下是可以编译运行的代码,在vc6.0下通过。 #include <stdio.h> #define length 20 void sequencesearch(int *fp,int length); void search(int *fp,int length); void sort(int *fp,int length); void main() { int count; int arr[length]; printf("请输入你的数据的个数:\n"); scanf("%d",&count); printf("请输入%d个数据\n",count); for(int i=0;i<count;i++) { scanf("%d",&arr[i]); } int choise=0; do { printf("1.使用顺序查询.\n2.使用二分查找法查找.\n3.退出\n"); scanf("%d",&choise); if(choise==1) sequencesearch(arr,count); else if(choise==2) search(arr,count); else if(choise==3) break; } while (choise==1||choise==2||choise==3); } void sequencesearch(int *fp,int length) { int data; printf("开始使用顺序查询.\n请输入你想要查找的数据.\n"); scanf("%d",&data); for(int i=0;i<length;i++) if(fp[i]==data) { printf("经过%d次查找,查找到数据%d.\n",i+1,data); return ; } printf("经过%d次查找,未能查找到数据%d.\n",i,data); } void search(int *fp,int length) { int data; printf("开始使用顺序查询.\n请输入你想要查找的数据.\n"); scanf("%d",&data); printf("由于二分查找法要求数据是有序的,现在开始为数组排序.\n"); sort(fp,length); printf("数组现在已经是从小到大排列,下面将开始查找.\n"); int bottom,top,middle; bottom=0; top=length; int i=0; while (bottom<=top) { middle=(bottom+top)/2; i++; if(fp[middle]<data) { bottom=middle+1; } else if(fp[middle]>data) { top=middle-1; } else { printf("经过%d次查找,查找到数据%d.\n",i,data); return; } } printf("经过%d次查找,未能查找到数据%d.\n",i,data); } void sort(int *fp,int length) { printf("现在开始为数组排序,排列结果将是从小到大.\n"); int temp; for(int i=0;i<length;i++) for(int j=0;j<length-i-1;j++) if(fp[j]>fp[j+1]) { temp=fp[j]; fp[j]=fp[j+1]; fp[j+1]=temp; } printf("排序完成!\n下面输出排序后的数组:\n"); for(int k=0;k<length;k++) { printf("%5d",fp[k]); } printf("\n"); } 我粗略的测试了下,没有什么问题,有问题的话可以百度给我留言,当然,程序很容易,你可以自己修改。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
单选题有一位科学家发现某岛屿4万人口中带有
委托价格是什么意思啊?
宜家网上商城可以绑定宜家会员卡吗?如何绑定
苍南县人民检察院的案件是移交苍南县法院还是
房子装修时需要先买什么东西?
开通期货需要什么条件和资金
华龙区濮阳兰顿袋鼠这个地址怎么能查询到,着
人力资源师考证有什么作用
小鱼电动车是那里出的
下列常用词语的字音不完全正确的一项是A.不愧
一条直线可把平面分成两个部分,两条直线最多
饭和粥哪个热量高
请问什么国产手机相素最高?
作文(60分)阅读下面材料,根据要求作文。如果
剑侠三唐门机关小猪任务,碎片摧毁了一个该怎
推荐资讯
城区局本部(丙村营业厅)地址在哪?我要去那里
五峰土家族自治县宜昌波司登(南北路)地址是什
快捷快递(安溪分公司)地址在哪,我要去那里办
我找人贷款五十万,没见过,但是后来他说手续
一些同学正在吃水果作文
罗曼·罗兰有句名言:“如果你想独占真理,真
秋水仙素在哪里可以买到
手机QQ怎么阻止陌生人进我空间?
茅箭区十堰EF专卖店在哪里啊,我有事要去这里
单选题“旧时代的最后一位诗人,同时又是新时
我平常和朋友玩斗地主总是输。请问有什么口诀
有一台八缸四冲程柴油机,汽缸直径为250mm,活
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?