查找算法之折半搜索算法

A,折半查找算法:該算法是在一個有序表中查找給定的元素,並返回該元素的所在序列的下標或者查找失敗返回一個代表失敗的數,比如-1代表查找失敗。
B,算法原理:
1)給定有序序列a1,a2,a3,...,an,升序排列;
2)查找指定元素e在序列中的下標,首先用e與array[n/2]比較大小;
3)如果e小,則繼續在0-n/2之間的元素中去找,否則到n/2-n之間的元素中去找;
4)重複 2) 和 3)過程,直到找到該元素返回下標,或者查找失敗返回-1,查找結束。
下面爲查找給定元素的過程:
給定序列:1,3,6,9,12,15,16,21,24(元素個數n = 9),查找元素4並返回其下標。
1)4 和 array[9/2] =9比較,4小;
2)接着4和array[4/2]=3比較,4大;
3)然後4和array[(3+4)/2]=6比較,4小;
4)此時3沒有元素可比較,該元素不存在返回-1,查找結束。
C,算法實現:

#include"iostream"

usingnamespace std;

intmain()

{

        int search(int[], int, int, int);

        int array[] = {1,3,6,9,12,15,16,21,24};

        int n = sizeof(array)/sizeof(int*);

        int elem, index;

        cout<<"輸入要查找的元素:";

        cin>>elem;

        index = search(array, 0, n-1, elem);

        cout<<index<<endl;

        return 0;

}

//array爲有序數組,elem爲待查找元素,lowhigh分別是目標數組的第一個和最後一個元素的下標

intsearch(int array[], int low, int high, int elem)

{

        //如果沒找到,返回-1

        if(low > high)

                  return -1;

        int mid = (low + high)/2;

        //如果找到則返回該元素下標

        if(elem == array[mid])

                  return mid;

        //mid左邊元素中去查找

        else if(elem < array[mid])

                  return search(array, low, mid-1, elem);

        //mid右邊元素中去查找

        else

                  return search(array, mid+1, high, elem);

}

運行結果:

   查找算法之折半搜索算法

D,複雜度分析

(a)時間複雜度:我們可以用一顆二叉樹描述整個查找過程,n個元素高度爲logn,而每次比較過程複雜度都爲O(1),所以折半查找時間複雜度爲O(logn);

(b)空間複雜度:空間複雜度爲O(1)。


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