查詢演算法(二)二分搜尋法
二分搜尋法適用於有序的陣列,比如[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>
usingnamespace 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