1.9折半查找。
1.问题描述
N个有序整数数列已放在一维数组中,利用二分查找法查找整数m在数组中的位置。
客找到,则输出且下标柜,反才,四输出 “Not he toundl?
2.问题分析
二分查找法(也叫折半查找)其本质是分治算法的一种。所谓分治算法是指的分而治之,即将较大规模的问题分解成几个较小规模的问题,这些子问题互相独立且与原问题相同,通过对较小规模问题的求解达到对整个问题的求解。我们把将问题分解成两个较小问题求解的分治方法称为二分法。需要注意的是,二分查找法只适用于有序序列。
二分查找的基本思想是:每次查找前先确定数组中待查的范围,假设指针 low 和high(low<high)分别指示待查范围的下界和上界,指针 mid指示区间的中间位置,即 mid=(low+high)/2,把m与中间位置(mid)中元素的值进行比较。如果m的值大于中间位置元素中的值,则下一次的查找范围放在中间位置之后的元素中;反之,下一次的查找范围放在中间位置之前的元素中。直到low>high,查找结束。
3.代码
#include <iostream>
using namespace std;
int Search_Bin(int A[],int key,int n){
int low = 0;
int high = n-1;
int mid;
while(low<=high){
mid=(low+high)/2;
if(key==A[mid]){
return mid;
}
else if(key<A[mid]){
high=mid-1;
}
else{
low=mid+1;
}
}
return 0;
}
void sort(int A[],int n){
//冒泡法排序
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(A[j]>A[j+1]){
int t=A[j];
A[j]=A[j+1];
A[j+1]=t;
}
}
}
}
void Print(int A[],int n){
for(int i=0;i<n;i++){
cout<<A[i]<<" ";
}
cout<<endl;
}
int main()
{
int A[10]={2,1,4,6,7,3,8,0,5,9};
Print(A,10);
sort(A,10);
Print(A,10);
cout<<Search_Bin(A,7,10)+1;
return 0;
}