有序和无序数组的二分搜索算法

题目意思

1、给定有序数组A和关键字key,判断A中是否存在key,如果存在则返回下标值,不存在则返回-1。

2、给定无序数组A和关键字key,判断A中是否存在key,如果存在则返回1,不存在则返回0。

对于1、2问题,,我们都可以简单的写出O(n)的从头到尾为的扫描算法,这里就不在累赘,这里我们讨论的是基于二分查找的算法,使其时间在渐进意义上达到O(logn)。

对于有序的数组,很“容易”写出基于二分的函数、

那么问题2,对于无序数组,怎么查找呢?这里我们用到了快速排序的划分原则。算法大致如下:

函数调用BinarySearch(a,n,key); a[1..n]

在无序数组a[n]中查找x是否存在,如果存在返回1,不存在返回0

这里我们用到快速排序中的划分规则,大致意思如下

将数组A[p..r]划分为两个字数组A[p..q-1]和A[q+1..r],使得

A[p..q-1]中的每个元素都小于等于A[q],并且,小于等于A[q+1..r]

对于查找关键字key,if(key==A[q]) return 1;

if(key<A[q])查找字数组A[p..q-1]

if(key>A[q])查找字数组A[q+1..r]

代码和注释:

<span style="font-size:18px;">/** *@xiaoran */#include<iostream>#include<cstdio>#include<map>#include<cstring>#include<string>#include<algorithm>#include<queue>#include<vector>#include<stack>#include<cstdlib>#include<cctype>#include<cmath>#define LL long longusing namespace std;/** *二分查找 *函数调用BinarySearch(a,0,n-1,key); *在有序数组a[n]中查找x是否存在,如果存在返回下标,不存在返回-1 */int BinarySearch(int *a,int left,int right,int &key){//在有序数组a[n]中查找x是否存在,如果存在返回下标,不存在返回-1while(left<=right){int mid=(left+right)/2;if(key==a[mid]) return mid;else if(key>a[mid]) left=mid+1;else right=mid-1;}return -1;}/** *二分查找 *函数调用BinarySearch(a,n,key); *在无序数组a[n]中查找x是否存在,如果存在返回1,不存在返回0 *这里我们用到快速排序中的划分规则,大致意思如下 *将数组A[p..r]划分为两个字数组A[p..q-1]和A[q+1..r],使得 *A[p..q-1]中的每个元素都小于等于A[q],并且,小于等于A[q+1..r] *对于查找关键字key,if(key==A[q]) return 1; *if(key<A[q]) 查找字数组A[p..q-1] *if(key>A[q]) 查找字数组A[q+1..r] */int Binary_Init(int *a,int p,int r){int tmp,i,j;tmp=a[p];i=p+1; j=r;while(true){while(a[i]<=tmp) ++i;while(a[j]>tmp) –j;if(j<=i) break;else{swap(a[i],a[j]);++i; –j;}}swap(a[p],a[j]);//关键字放到中间return j;//返回关键字的位置}int BinarySearchPlus(int *a,int l,int r,int key){if(l<r){int mid=Binary_Init(a,l,r);//cout<<a[mid]<<" "<<key<<endl;if(a[mid]==key) return 1;//Yeselse if(key<a[mid]){//搜索左边一半return BinarySearchPlus(a,l,mid-1,key);}else{//key>a[mid],//搜索右边一半return BinarySearchPlus(a,mid+1,r,key);}}if(l==r) return a[l]==key;//只有一个元素return 0;//No}int main(){int A[9]={0,9,4,3,12,5,34,55,44};int key;while(cin>>key){cout<<BinarySearch(A,1,8,key)<<endl;cout<<BinarySearchPlus(A,1,8,key)<<endl;}return 0;}</span>

只有在前进中不断学会选择,学会体会,学会欣赏。

有序和无序数组的二分搜索算法

相关文章:

你感兴趣的文章:

标签云: