圖解數據結構(4)——二分法查找法

轉載自http://www.cppblog.com/guogangj/archive/2009/10/15/98649.html

如何從數組裏找一個元素的位置?如果排列是無序的,我們只能從頭到尾找,但如果排列是有序的,我們則可以用別的更好的方法,二分查找法就類似我們在英漢詞典裏找一個單詞的方法。如下圖所示(假如我們要查找的數字是“88”):

下面我給出了一段demo代碼,來演示二分查找法比順序查找快多少,代碼爲了方便起見,初始化有序表的時候填入的數字都是均勻的,而事實上數字可以不均勻。你可以調整一下代碼中TABLE_SIZE的值,從500,調到5000,再調到10000,再調到30000……你會發覺兩者差距越來越明顯。我在第一篇的地方提到二分查找法的複雜度爲Ο(logn),而順序查找的複雜度爲Ο(n),當n越來越大時候,Ο(logn)的優勢也就越來越明顯,當然了,前提是“有序”,纔可用二分查找法。

#include "stdio.h"
#include "time.h"

#define TABLE_SIZE 50000

//returns the position, -1 means failed.
int SequenceSearch(int *pArray, int iArraySize, int iVal)
{
    int i;
    for(i=0; i<iArraySize; i++)
    {
        if(pArray[i]==iVal)
            return i;
    }

    return -1;
}

//returns the position, -1 means failed.
int BinarySearch(int *pArray, int iArraySize, int iVal)
{
    int iLeft = 0;
    int iRight = iArraySize-1;
    while(iLeft<=iRight)
    {
        int iMiddle = (iLeft+iRight)/2;
        if(iVal < pArray[iMiddle])
        {
            iRight = iMiddle-1;
        }
        else if(iVal > pArray[iMiddle])
        {
            iLeft = iMiddle+1;
        }
        else
            return iMiddle;
    }

    return -1;
}

int main(int argc, char* argv[])
{
    //make the table
    int table[TABLE_SIZE];
    int i;
    for(i=0; i<TABLE_SIZE; i++)
    {
        table[i] = i*2;
    }

    clock_t ctBegin = clock();
    //Test sequence search
    for(i=0; i<TABLE_SIZE; i++)
    {
        SequenceSearch(table, TABLE_SIZE, i*2);
    }
    clock_t ctEnd = clock();

    printf("SequenceSearch takes %d clocks.\n", ctEnd-ctBegin);

    //Test binary search
    ctBegin = clock();
    for(i=0; i<TABLE_SIZE; i++)
    {
        BinarySearch(table, TABLE_SIZE, i*2);
    }
    ctEnd = clock();
    
    printf("BinarySearch takes %d clocks.\n", ctEnd-ctBegin);

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章