二分搜索(查找)方法
2017-04-26 08:49
501 查看
搜索:就是在数组中寻找一个指定元素的过程。例如:查找一个商品价格列表中指定价格的商品。
在讨论二分搜索方法前先说下顺序搜索:
顺序搜索
将关键字key顺序地与数组中每个元素进行比较,这个过程一直持续下去,直至关键字与某个元素匹配,或者所有数组元素都已比较完毕。
二分搜索(查找)方法
二分搜索是一种常用的搜索方法,它要求数组中的元素必须是有序存放的,二分搜索方法首先将关键字与位于数组中央的元素进行比较。比较结果有三种情况:
如果关键字小于中央元素,只需继续在数组的前半部分进行搜索。
如果关键字与中央元素相等,则搜索结束,找到匹配元素。
如果关键字大于中央元素,只需继续在数组的后半部分进行搜索。
使用二分搜索方法,每经过一次搜索,二分搜索方法会将搜索范围缩小一半。假定数组元素个数为n,为方便计算,假定n是2的幂。那么第一次比较后,只剩n/2个元素需要继续搜索;第二次比较后只剩下(n/2)/2个元素需要继续搜索。则第k次比较后,剩下n/2^k个元素需要继续搜索。当k=log2n(以2为底n的对数),只剩下一个元素了,因而只需要再进行一次比较。因此二分搜索方法在一个已排序数组中查找一个关键字,在最坏情况下只需log2n(以2为底n的对数)+1次比较操作,对于一个有1024个(2^10)元素的列表,二分搜索在最坏情况下只需11次比较,而顺序搜索方法在最坏情况下需1024次比较。
二分搜索方法在每次比较之后,会将需要搜索的数组范围缩小一半,可以用变量low和high分别表示当前搜索的数组区域的首下标和尾下标,则变量mid的值就为(low+high)/2.
在讨论二分搜索方法前先说下顺序搜索:
顺序搜索
将关键字key顺序地与数组中每个元素进行比较,这个过程一直持续下去,直至关键字与某个元素匹配,或者所有数组元素都已比较完毕。
int linearSearch(int list[],int key,int arraySize) { for(int i = 0; i< arraySize; i++) { if(key == list[i])//顺序比较key值与list数组中的元素 { return i;//返回查找到的数组的下标 } } return -1;//-1表示没找到 }
二分搜索(查找)方法
二分搜索是一种常用的搜索方法,它要求数组中的元素必须是有序存放的,二分搜索方法首先将关键字与位于数组中央的元素进行比较。比较结果有三种情况:
如果关键字小于中央元素,只需继续在数组的前半部分进行搜索。
如果关键字与中央元素相等,则搜索结束,找到匹配元素。
如果关键字大于中央元素,只需继续在数组的后半部分进行搜索。
使用二分搜索方法,每经过一次搜索,二分搜索方法会将搜索范围缩小一半。假定数组元素个数为n,为方便计算,假定n是2的幂。那么第一次比较后,只剩n/2个元素需要继续搜索;第二次比较后只剩下(n/2)/2个元素需要继续搜索。则第k次比较后,剩下n/2^k个元素需要继续搜索。当k=log2n(以2为底n的对数),只剩下一个元素了,因而只需要再进行一次比较。因此二分搜索方法在一个已排序数组中查找一个关键字,在最坏情况下只需log2n(以2为底n的对数)+1次比较操作,对于一个有1024个(2^10)元素的列表,二分搜索在最坏情况下只需11次比较,而顺序搜索方法在最坏情况下需1024次比较。
二分搜索方法在每次比较之后,会将需要搜索的数组范围缩小一半,可以用变量low和high分别表示当前搜索的数组区域的首下标和尾下标,则变量mid的值就为(low+high)/2.
int binarySearch(int list[], int key, int arraySize) { int low = 0; int high = arraySize - 1; int mid; while (high >= low) { mid = (low + high) / 2; if(key <= list[mid]) { high = mid - 1; } else if(key == list[mid) { return mid; } else { low = mid + 1; } } return -1;//-1表示没搜索到 }
相关文章推荐
- [整理]二分查找搜索算法原理及递归,迭代方法实现
- 递归方法实现二分搜索
- 「算法」查找二分搜索树的第K个元素
- POJ - 3685 Matrix (二分搜索:查找第k大的值)
- POJ - 3579 Median(二分搜索,查找第K大的值)
- 二分查找 数组和指针方法
- 通过二分的方法查找小于n的素数的个数
- 一些重要的算法------启发式搜索,束搜索(beam search),二分查找算法 and so on............
- 第2章 递归与分治策略,二分搜索技术(查找不成功时,返回区间位置)
- 算法---二分查找方法
- HDU 2871 Memory Control 线段树(区间合并)+二分查找+vector的常用方法
- ruby数组和哈希表的区别,递归,二分查找方法
- 二分查找/二分搜索(binary_search)详解
- 编程珠玑第9章二分搜索(有重复数字)中查找某数出现的第一个位置
- 一个可能存在Bug的二分查找方法的实现,大家一起看看有什么问题没
- Notepad++ 中文查找(中文搜索)问题解决方法
- 二分搜索方法
- Binary Search 二分查找,二分搜索 C++
- 二分查找的递归方法python
- PowerShell查找数组内容、搜索数组、查询数组的方法