二分搜索法适用于有序的数组,比如[1,3,5,7,9]这样的数组适合用二分搜索法查找元素。
假设存在一个数组为从小到大顺序排序。
二分思想:
(1)首先,我们视数组所有元素为当前查询范围
(2)拿当前查询范围中间的那个元素与要查元素比较,如果值想等,则查找成功,推出查找任务;如果值小于要查的那个元素的值,则取数组前半部分为当前查询范围;如果值大于要查的那个元素的值,则取数组前半部分为当前查询范围。
(3)重复步骤(2)。
实例代码:
//
// main.cpp
// BinSearch
//
// Created by 胡士伟 on 16/6/8.
// Copyright © 2016年胡士伟. All rights reserved.
//
#include <iostream>
using namespace std;
int binSearch(int data[],int k,int n) //二分搜索法
{
int low=0,high=n-1;
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(data[mid]==k)
{
return mid;
}
else if(data[mid]>k)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
return –1;
}
void swap(int *a,int *b) //交换两个数
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void sort(int data[],int n) //冒泡排序,下沉法
{
while(n>=0) //最多n趟排序
{
for(int j=0;j+1<=n;j++)//前n个元素两两比较
{
if(data[j]>data[j+1])
{
swap(data[j],data[j+1]);
}
}
n–;
}
}
int main(int argc,const char * argv[]) {
// insert code here…
int a[9]={44,23,36,57,24,58,2,5,0};
int n=sizeof(a)/sizeof(a[0]);
sort(a,n);
cout<<“排序后的数组为:“;
for(int i=0;i<n;i++)
{
cout<<a[i]<<” “;
}
cout<<endl;
cout<<“数组中总共有“<<n<<“个元素“<<endl;
int s=binSearch(a,36,n);
if(s>=0)
{
cout<<“查找成功!“<<endl;
cout<<“位置在排序后数组的第“<<s<<“位!”<<endl;
}
else
{
cout<<“查找失败“;
}
return 0;
}
运行结果如下:
排序后的数组为:0 2 5 23 24 36 44 57 58
数组中总共有9个元素
查找成功!
位置在排序后数组的第5位!
Program ended with exit code: 0