问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

C语言程序题:写出递归与非递归两种折半查找程序,并分析其时间空间复杂...

发布网友 发布时间:2024-04-09 13:14

我来回答

1个回答

热心网友 时间:2024-04-10 14:31

折半查找需要先对数据进行排序。

#include<iostream>
using namespace std;

int bSearch(int data[], const int x, int beg, int last)
{
int mid;
if (beg > last)
{
return -1;
}


while(beg <= last)
{
mid = (beg + last) / 2;
if (x == data[mid] )
{
return mid;
}
else if (data[mid] < x)
{
beg = mid + 1;
}
else if (data[mid] > x)
{
last = mid - 1;
}
}
return -1;
}



int  rBSearch(int data[], const int x, int beg, int last)
{

if(beg>last) return -1;
int mid = -1;
    mid = (beg + last) / 2;
if (x == data[mid])
{
return mid;
}
else if (x < data[mid])
{
return rBSearch(data, x, beg, mid - 1);
}
else if (x > data[mid])
{
return rBSearch(data, x, mid + 1, last);
}
}

int main(void)
{
int data[5] = {0};
//int num = 3;
int num=30;

cout << "The array is : " << endl;
int n = sizeof(data)/sizeof(int);
for (int i = 0; i < n; i++)
{
data[i] = i;
cout << data[i] << " ";
}
cout << endl;

int index = -1;
//index = bSearch(data,num,0,n);
index = rBSearch(data, num, 0,n);
cout << "Index of " << num << " is " << index << endl;
system("pause");
    return 0;
}

 以上是冒泡排序算法的实现。

折半查找算法描述如下:


在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:

1)     待查找数据值与中间元素值正好相等,则放回中间元素值的索引。

2)     待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。

3)     待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值

4)     如果最后找不到相等的值,则返回错误提示信息。

 实现如下:

#include<iostream>
using namespace std;

int bSearch(int data[], const int x, int beg, int last)
{
int mid;
if (beg > last)
{
return -1;
}


while(beg <= last)
{
mid = (beg + last) / 2;
if (x == data[mid] )
{
return mid;
}
else if (data[mid] < x)
{
beg = mid + 1;
}
else if (data[mid] > x)
{
last = mid - 1;
}
}
return -1;
}



int  rBSearch(int data[], const int x, int beg, int last)
{
int mid = -1;
mid = (beg + last) / 2;
if (x == data[mid])
{
return mid;
}
else if (x < data[mid])
{
return rBSearch(data, x, beg, mid - 1);
}
else if (x > data[mid])
{
return rBSearch(data, x, mid + 1, last);
}
return -1;
}

int main(void)
{
int data[5] = {0};
int num = 3;

cout << "The array is : " << endl;
int n = sizeof(data)/sizeof(int);
for (int i = 0; i < n; i++)
{
data[i] = i;
cout << data[i] << " ";
}
cout << endl;

int index = -1;
//inedx=bSearch(data,num,0,n);
index = rBSearch(data, num, 0,n);
cout << "Index of " << num << " is " << index << endl;
system("pause");
    return 0;
}

复杂度分析:

折半查找就像搜素二叉树:中间值为二叉树的根,前半部分为左子树,后半部分为右子树。折半查找法的查找次数正好为该值所在的层数。等概率情况下,约为log2(n+1)-1,其算法复杂度为O(log(n))。

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
徐州质量好的铝粉颜料 陕西渭南市富平县有多少高中 富平县职教中心招收往届生吗 山东医科大学是985大学吗 高三必看:山东省【医学院校】最全解读! 山东大学齐鲁医学院是985或211 奥斯卡纽斐仕摄影怎么样 宁波婚纱十大影响力品牌 奥斯卡婚纱照怎么样 奥斯卡婚纱摄影简介 个人劳务报酬申报的选项里18位凭证是什么? 大便出血,治疗痔疮的哪一种药好一点? 安徽创汇康护有限公司怎么样? 造梦西游4宠物哪个好平民造梦西游4宠物哪个好 in me the tiger sniffes the rose是什么意思 siegfried translateur什么意思 过滤觜中的焦油对植物有伤害吗? 40支香烟去掉烟纸和过滤嘴用水瓶封闭泡一天连烟带水一起喝下去会怎样... 数字768是什么意思? 污水处理中的折污率(折污系数)是什么意思? 膝关节换骨膜后腿脚困的难受是咋回事? 重庆南坪西路88号坐公交车到珠江太阳城是多少路公交车? 巴滨路珠江城到九龙坡西站 武汉牙齿矫正口碑好的医院? 节理和解理有什么区别呢? 治本在得人文言文翻译 治本在得人文言文翻译及原文 一统草原代表什么数字 ...老愚公,移几山。请高手们告诉一下是哪3个数字? 28伏500瓦发电机要多大拉力 28伏40安的直流发电机是多少瓦 G1876是在郑州东站还是在火车站发车 1986年阴历12月初6是什么星座 癌病人能吃海参吗.. 大年初十能要钱吗? 海南新福地雅居值得买吗? 逆水寒排位在哪里打? 欧派橱柜柜体为什么没有顶板呢? 这个是啥 咋用 买手机壳送的 董方哪年出生的?包钢股份独立董事 中钢吉铁在我国铁合金行业中占何种的地位啊? whose 在定语从句中可不可以用于物体的拥有 合资车哪个牌子不易锈 为啥麦当劳免费薯条没有了 仄仄仄平平仄平为抝句否? 出句是,仄仄仄仄平 可以救吗,怎么救? 龙年什么生肖运气好 老天仓应该做什么吃的 老填仓吃什么 word怎么把中文和英文分开? 那位高手知道,在CAD中把“样条曲线”加宽,是怎样的步骤?谢谢!_百度知...
  • 焦点

最新推荐

猜你喜欢

热门推荐