折半查找法的温习

折半查找法适合于1采用顺序存储结构的2必须按照关键字大小排序的序列查找

如代码所示:

 1 #include <stdio.h>
 2
 3 int BinSearch(int a[], int length, int k)
 4 {
 5     int low = 0, high = length - 1;
 6     int mid;
 7     while(low <= high)
 8     {
 9         mid = (low + high) / 2;
10         if(a[mid] == k)
11             return mid;
12         else if(a[mid] > k)
13             high = mid - 1
14         else
15             low = mid + 1;
16     }
17     return 0;
18 }
19
20 int main()
21 {
22     int a[8] = {2, 3, 4, 5, 6, 7, 8, 10};
23     printf("元素5的位置在 :%d\n", BinSearch(a, 8, 5));
24 }

折半查找法的基本思路是设置low,high, mid三个变量。如代码所示,就是通过不断的改变这3个变量来查找是否存在查找值K,如存在返回它所在的位置,如不存在,返回0

折半查找法的优点是比较次数比顺序查找少,但缺点是必须是要对已排序号的序列查找。

一般的在考试中,不要考折半查找法的代码。只会考折折半查找法的查找成功时的平均查找长度或者查找不成功时候的平均查找长度。

其中具体的做法是 画一个完全二叉排序树,数每一层有几个元素,各自乘以层数,求和。再除以元素个数。得到查找成功的平均查找长度。

查找不成功的平均查找长度就是 用虚线 把空出来的 位置补齐(最后一层的需要再一层)。然后对虚线求查找长度就行。

时间: 2024-08-10 17:13:29

折半查找法的温习的相关文章

【分治】折半查找法

问题 K: [分治]折半查找法 时间限制: 1 Sec  内存限制: 128 MB提交: 17  解决: 9[提交][状态][讨论版] 题目描述 大魔导师培根曾经说过:“读书使人明智,读诗使人聪慧,演算使人精密,哲理使人深刻,伦理学使人有修养,逻辑修辞使人善辩.”由此可见书籍的重要性是不言而喻的.而与书籍天天打交道的图书管理员,更是夺天地之造化,吸日月之精华的“神之职业”.据史料记载,魔法世界从古至今诞生的众多不平凡的人物中,有不少人都曾经做过“图书管理员”,如道家学派创始人老子,威软公司创始人

折半查找法的两种实现

折半查找法: 在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现: 1)     待查找数据值与中间元素值正好相等,则放回中间元素值的索引. 2)     待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值. 3)     待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值 4)     如果最后找不到相等的值,则返回错误提示信息. 按照二叉树来理解:中间值为二叉树的根,前半部

对分查找法(二分查找法,折半查找法)

二分查找法是针对已经排好序的序列进行查找 每次折半查找 算法时间复杂度,对于长度为N的序列,每次执行N/2,假设k次结束,最后到第一个N/2^k=0,所以k=logN 时间复杂度logN int binarysearch(const int array[], int x, int N) { int low, mid, high; low = 0, high = N - 1; while (low <= high) { mid = (low + high) / 2; if(array[mid] <

小朋友学数据结构(6):折半查找法

小朋友学数据结构(6):折半查找法 折半查找法又称为二分查找法. (一)基本思想 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表. 重复以上过程,直到找到满足条件的记录,此时查找成功:或直到子表不存在为止,此时查找不成功. 2.png (二)时间复杂度 二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x

C语言数组之冒泡排序+折半查找法(二分查找)

冒泡排序算法 1 int num[5]; 2 int i; 3 //循环接收用户输入的元素 4 for(i=0;i<5;i++){ 5 printf("请输入第%d个元素\n",i+1); 6 scanf("%d",&num[i]); 7 } 8 for(i=0;i<4;i++){ //外层循环,控制排序的轮数 9 int j; 10 for(j=0;j<4-i;j++){ //内层循环,控制冒牌排序每轮的次数 11 if(num[j]&g

输入一组有序数据,使用折半查找法查找一个数据,并输出位置

#include <stdio.h> /** * 使用折半查找,来查找一个数 * * @param arr 数组 * @param len 数组的长度 * @param key 要查找的数 * * @return 要查找的数的位置,如果查找不到返回 -1 */ int searchItem(int arr[], int len, int key) { // 定义变量 int low = 0, high = len - 1, mid; // 循环 while (low <= high) {

数据结构50:二分查找法(折半查找法)

折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高.但是该算法的使用的前提是静态查找表中的数据必须是有序的. 例如,在{5,21,13,19,37,75,56,64,88 ,80,92}这个查找表使用折半查找算法查找数据之前,需要首先对该表中的数据按照所查的关键字进行排序:{5,13,19,21,37,56,64,75,80,88,92}. 在折半查找之前对查找表按照所查的关键字进行排序的意思是:若查找表中存储的数据元素含有多个关键字时,使用哪种关键字做折半查找,就需

算法:折半查找法

输入代码: /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:sum123.cpp * 作 者:林海云 * 完成日期:2015年1月12日 * 版 本 号:v2.0 * * 问题描述:给定一个排序好的数组,使他可以具备查找功能 * 输入描述:要查找的数 * 程序输出:查找数的位置 */ #include<iostream> using namespace std; const int n=10; int main(

有15个数按从大到小的顺序存放在一个数组中, 用折半查找法找出该数是数组的第几个元素的值, 如果该数不在数组中,则输出“无此数”

//2017年7月22日 #include <stdio.h> #define LEN 15 int main(){ int n; void binSearch(int * p,int n); int arr[LEN]={98,97,88,87,76,70,65,54,43,42,39,36,35,31,29}; printf("请输入要查找的数:\n"); scanf("%d",&n); binSearch(arr,n); return 0;