折半查找
2015-10-17 00:26
281 查看
从表列中查一个数最简单的方法是从第1个数开始顺序查找,将要找的数与表列中的数一一比较,直到找到为止(如果表列中无此数,则应找到最后一个数,然后判定“找不到”)但这种“顺序查找法”效率较低。如果表列中有1000个数,且要找的数恰恰是第1000个数,则要进行1000次比较才得到结果。平均比较次数为500次。
折半查找法是效率较高的一种方法,基本思路如下:
假如有已按由小到大排好序的9个数,A[1]--A[9]
其值分别为:1 3 5 7 9 11 13 15 17
若输入一个3,想查3是否在此数列中,先找出表列中居中的数,即a[5]
将要找的数3与a[5]比较,a[5]的值是9,发现a[5]>3,显然3应当在a[1]到a[5]之间
这样可以缩小查找范围;再找a[1]到a[5]范围内的居中的数,即a[3]
将要找的数3与a[3]比较,a[3]的值为5,发现a[3]>3,显然3应当在a[1]到a[3]范围内
再将查找范围缩小一半,与a[1]到a[3]范围内的居中的数a[2]比较,发现要找的数3等于a[2],查找结束,一共比较了3次。在一个有序数组中,折半查找也就是利用二分法的思想找出数组中的内容。代码如下:
折半查找法是效率较高的一种方法,基本思路如下:
假如有已按由小到大排好序的9个数,A[1]--A[9]
其值分别为:1 3 5 7 9 11 13 15 17
若输入一个3,想查3是否在此数列中,先找出表列中居中的数,即a[5]
将要找的数3与a[5]比较,a[5]的值是9,发现a[5]>3,显然3应当在a[1]到a[5]之间
这样可以缩小查找范围;再找a[1]到a[5]范围内的居中的数,即a[3]
将要找的数3与a[3]比较,a[3]的值为5,发现a[3]>3,显然3应当在a[1]到a[3]范围内
再将查找范围缩小一半,与a[1]到a[3]范围内的居中的数a[2]比较,发现要找的数3等于a[2],查找结束,一共比较了3次。在一个有序数组中,折半查找也就是利用二分法的思想找出数组中的内容。代码如下:
#include<stdio.h> int binsearch(int x,int arr[],int left,int right) { while(left<=right) { int mid=left-(left-right)/2;/*注意此处一定要是"<="*/ /*为何此处不写成mid=(left+reght)/*由于此写法可能会导致溢出*/ if(arr[mid]==x) { return mid; } else if(x<arr[mid]) { right=mid-1; } else { left=mid+1; } } return -1; } int main() { int arr[]={1,7,54,87,121,312,938}; int vet,num; scanf("%d",&num); vet=binsearch(num,arr,0,sizeof(arr)/sizeof(arr[0])-1); if(vet!=-1)/*调用外函数,返回值赋给了vet*/ { printf("%d",arr[vet]); } else printf("not exist"); return 0; }
相关文章推荐
- C++二分法在数组中查找关键字的方法
- php二分法在IP地址查询中的应用
- javascript 折半查找字符在数组中的位置(有序列表)
- C++ 先对数组排序,在进行折半查找
- Python实现二分法算法实例
- Python二分法搜索算法实例分析
- 八大方法巧妙排除网络连接故障
- C#版二分查找(代碼)
- linux kernel data struct: binary search
- nyoj-306-走迷宫--二分法+dfs
- C冒泡递归折半等算法
- HDU 2199
- 数值计算库中使用设计模式(一)
- C语言 -- 折半查找
- (核心算法)查找某个数在有序数组中(递增,含重复)第一次出现的下标
- Java学习笔记——折半查找与逐个查找方式
- leetcode:Find Peak Elements 菜鸟解法
- leetcode:Find Minimum in Rotated Sorted Array II 菜鸟解法
- leetcode:Find Minimum in Rotated Sorted Array 菜鸟解法
- leetcode:Search Insert Position菜鸟解法