导航:首页 > 编程语言 > 编程实现折半查找设计思路

编程实现折半查找设计思路

发布时间:2023-05-14 08:05:38

⑴ c语言编程实现“折半查找”的过程。

//参考代码如下:
#include <stdio.h>
int main()
{
int i, j, n, k=0, isFound=0;
int num[15] = {88,86,75,74,61,56,52,43,39,34,31,22,18,16,8}; //测试数组
printf("请输出一个整数:\n");
scanf("%d", &n);
i = (int)15/2; //对折位移量
j = (int)15/2; //取数“指针”
while(k<2)
{
i = (int)i/2;
if(i == 0) k++; //i==0 即折半到无可再折时,仍有最后一次比较,故以k做计数
//若未相等,计算下一循环指针的位置
if(n<num[j])
j = j + (i + 1);
else if(n>num[j])
j = j - (i + 1);
else
{
isFound = 1;
break; //若找到相等数,标记已找到并退出循环
}
}
//输出结果
if(isFound)
printf("该数是数组中第%d个元素的值\n", j);
else
printf("查无此数!\n");
return 0;
}

python实现折半查找和归并排序算法

python实现折半查找和归并排序算法
今天依旧是学算法,前几天在搞bbs项目,界面也很丑,评论功能好像也有BUG。现在不搞了,得学下算法和数据结构,笔试过不了,连面试的机会都没有……
今天学了折半查找算法,折半查找是蛮简单的,但是归并排序我就挺懵比,看教材C语言写的归并排序看不懂,后来参考了别人的博客,终于搞懂了。
折半查找
先看下课本对于 折半查找的讲解。注意了,折半查找是对于有序序列而言的。每次折半,则查找区间大约缩小一半。low,high分别为查找区间的第一个下标与最后一个下标。出现low>high时,说明目标关键字在整个有序序列中不存在,查找失败。

看我用python编程实现:
defBinSearch(array, key, low, high): mid=int((low+high)/2) ifkey==array[mid]:# 若找到 returnarray[mid] iflow > high: returnFalse ifkey < array[mid]: returnBinSearch(array, key, low, mid-1)#递归 ifkey > array[mid]: returnBinSearch(array, key, mid+1, high) if__name__=="__main__": array=[4,13,27,38,49,49,55,65,76,97] ret=BinSearch(array,76,0,len(array)-1)# 通过折半查找,找到65 print(ret)
输出: 在列表中查找76.
76
时间复杂度:O(logn)
归并排序算法
先阐述一下排序思路:
首先归并排序使用了二分法,归根到底的思想还是分而治之。归并排序是指把无序的待排序序列分解成若干个有序子序列,并把有序子序列合并为整体有序序列的过程。长度为1的序列是有序的。因此当分解得到的子序列长度大于1时,应继续分解,直到长度为1.
(下图是分解过程,图自python编程实现归并排序)

合并的过程如下:

很好,你现在可以和别人说,老子会归并排序了。但是让你写代码出来,相信你是不会的……
来来来,看我用python写的归并排序算法:
defmerge_sort(array):# 递归分解 mid=int((len(array)+1)/2) iflen(array)==1:# 递归结束的条件,分解到列表只有一个数据时结束 returnarray list_left=merge_sort(array[:mid]) list_right=merge_sort(array[mid:]) print(">>>list_left:", list_left) print(">>>list_right:", list_right) returnmerge(list_left, list_right)# 进行归并 defmerge(list_left, list_right):# 进行归并 final=[] whilelist_leftandlist_right: iflist_left[0] <=list_right[0]:# 如果将"<="改为"<",则归并排序不稳定 final.append(list_left.pop(0)) else: final.append(list_right.pop(0)) returnfinal+list_left+list_right# 返回排序好的列表 if__name__=="__main__": array=[49,38,65,97,76] print(merge_sort(array))输出:
输出:
>>>list_left: [49]
>>>list_right: [38]
>>>list_left: [38, 49]
>>>list_right: [65]
>>>list_left: [97]
>>>list_right: [76]
>>>list_left: [38, 49, 65]
>>>list_right: [76, 97]
[38, 49, 65, 76, 97]
时间度杂度: 平均情况=最好情况=最坏情况=O(nlogn)
空间复杂度:O(n)
稳定性:稳定
对序列{ 6, 5, 3, 1, 8, 7, 2, 4 }进行归并排序的实例如下:

使用归并排序为一列数字进行排序的宏观过程:

以上就是本文的全部内容,希望对大家的学习有所帮助

⑶ VB 编程中的顺序查找和折半查找怎么编的

1.顺序查找没什么说的,就是
for(int
i=0;i<len;i++)
if(arr[i]==data)
return
i;
return
-1;
2.折半就是设计low,high
int
low=0;
int
high=len-1;
int
mid;
while(low<=high)
{
mid=(low+high)/2;
if(data>arr[mid])
low=mid+1;
else
if(data<arr[mid])
high=mid-1;
else
return
mid;
}
缉弧光旧叱搅癸些含氓return
-1;

⑷ 如何编程实现“折半查找”的过程

将这一句if(f=0)
printf("Not Found");
改为
if(start>end)
printf("Not Found");
你的程序的问题:如果输入的数据不在数组中,f值也会改变,因为第一次循环的时候if、else if、else必然会执行一个,而其中的每个都会改变f的值。

⑸ C语言编程之拆半查找法

首先数组就得按从大到小或者从小到大先排列好,代码里面的数组已经按照从小到大的顺序排好了,这叫预排序,没有预排序就无法进行折半查找。。。。如世

折半查找,你要先确定一个头和一个尾,就像上面的top与bot,而你要查找的数据肯定会在头与尾之间那段数组中(前提是数组里面一定含有你要查找的数据)。。。。

那么为了加快查找速度,我们可以先拿头与尾中间的那个数据,与所要查找的数据(下面用c来表示该数据)进行比较,中间那个数的位置就在mid=(top+bot)/2。。。。

举这样的例子吧,从1到100的数中查找c。。。。

如果中间数50等于c,那就可以直接得出它在数组中的位置了,就是mid,代码if(c==a[mid])的作用就是这样。。。。

要说明一下,为什么它显示的代码printf("the position is %d\n",mid+1)中,mid要加1,如一个数在数组中的位置为0,那它就是在第一位,这个应该好理解吧。。。。

接着,如果中间数50小于c,那就说明了c的位置应该在中间到末尾那个位置,也就是51到100那个位置,代码if(c>a[mid])就是这样的意思,比较后,就把top=mid+1,即a[top]=51,再从51至100里面寻找c。。。。

如果中间数50大于c,那就表示c的位置应该在头到中间那个位置,就是说在1到49那个位置,对吧,代码中最后那个else起这样的作用,把bot=mid-1,也就是说a[bot]=49,通过循环,再从1至49里面寻找c。。。。

其实折半查找的思想很简单,就是比较中间数与查找数,判断出查找数是在前半段,还是在后半段,还是就等于中间数,如果在前半段,拿把前半段分离出来,再用其中间数与查找数比较,就这样不断循环,最终找到结果为止。。。。

数组若很差衡大,如有1000个数,一个个进行比较的话,最差也得比较1000次,这样很耗费时间与资源,折半查找法就能比较好地减少了循环的次数。。。。

当然虚橡做,前提是数组要预排序,如果是乱序的话,是不能用折半的。。。。

若还有什么不清楚,可以密我。。。。

阅读全文

与编程实现折半查找设计思路相关的资料

热点内容
python中的idle 浏览:998
五轴联动数控编程 浏览:963
换一台电脑如何远程云服务器 浏览:130
阿里云怎么买云服务器 浏览:662
java提取文字 浏览:95
阿里云服务器同人账号问题 浏览:418
5分钟解压轴题 浏览:339
安卓桌面二级文件夹 浏览:186
eps文档加密 浏览:261
手机怎么做pdf 浏览:162
ug曲面pdf 浏览:279
液化气还是压缩气 浏览:950
阿里云公共ntp服务器地址 浏览:991
金字塔学习机编程 浏览:684
多边形扫描线算法Python 浏览:718
快手app快手粉条在哪里 浏览:256
mysql备份数据库命令linux 浏览:544
车辆解压手续怎么样 浏览:432
怎么提安卓版本号 浏览:622
pdf转换成word网页版 浏览:313