1. 程式人生 > >查詢演算法(二)二分搜尋法

查詢演算法(二)二分搜尋法

二分搜尋法適用於有序的陣列,比如[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