順序表查找(順序查找、二分查找) C語言實現

1、基本概念


a. 從大量以前存儲的數據中檢索特定的一段信息或幾段信息的操作稱爲查找或搜索。


b. 平均查找長度ASL的計算公式爲:

其中,n 爲查找表的長度(元素個數),pi 爲查找第 i 個元素的概率,ci 是查找第 i 個元素時同給定值 K 所需比較的次數。

若查找每個元素的概率相同,則公式可簡化爲:

      

c. 順序表:是指採用數組對集合或線性表進行順序存儲的結構形式。


在順序表上進行查找又多種方法,這裏只介紹最主要的兩種方法:順序查找和二分查找。


2、順序查找


順序查找是一種最簡單和最基本的查找方法,它從順序表的一端開始,依次將每個元素的關鍵字同給定值 K 進行比較,直到相等或比較完畢還未找到。算法如下:


int Seqsch(struct ElemType A[], int n, KeyType K)
{
    int i;
    for (i = 0; i < n; i++)
        if (A[i].key == K)
            break;
    if (i < n)
        return i;
    else
        return -1;
}

其中,順序表採用一堆數組 A 表示,其元素類型爲 ElemType ,它含有關鍵字 key 域和其他一些數據域,key 域類型用標識符 KeyType 表示,線性表長度爲 n(元素個數)


改進: 可以把給定值 K 賦給數組 A 中第 n 個位置,這樣無需數組比較,只需元素比較,而且比較到第 n 位置時,A[n].key == K 必然成立,將自動結束循環。算法如下:


int Seqsch1(struct ElemType A[], int n, KeyType K)
{
    int i;
    A[n].key = K; //設置崗哨
    for (i = 0; ; i++)
        if (A[i].key == K)
            break;
    if (i < n)
        return i;
    else
        return -1;
}

順序查找分析:

缺點是速度慢,平均查找長度爲 (n + 1) / 2,時間複雜度爲 O(n) .

優點是即適用於順序表,也適用於單鏈表,同時對錶中元素排列次序無要求,給插入和刪除元素帶來了方便。


3、二分查找


二分查找又稱折半查找。

作爲二分查找對象的表必須是順序存儲的有序表,通常假定有序表是按關鍵字從小到大有序。

查找過程是首先取整個有序表 A[0] ~ A[n - 1] 的中點元素 A[mid] (mid = (0 + n -1) / 2) 的關鍵字同給定值 K 比較,相等則成功,若 K 較小,則對 剩餘的左半部分進行同樣

操作,若 K 較大,則對其剩餘的右半部分進行同樣的操作。算法如下(分爲遞歸和非遞歸兩種算法):


int Binsch(struct ElemType A[], int low, int high, KeyType K)//遞歸法
{//在 A[low] ~ A[hight]區間進行查找,low、hight初值分別爲 0 和 n-1
    if (low <= hight)
    {
        int mid = (low + high) / 2; //求中點元素下標
        if (K == A[mid].key)
            return mid;
        else if (K < A[mid].key)
            return Binsch(A, low, mid - 1, K);
        else 
            return Binsch(A, mid + 1, high, K);
    }
    else
        return -1; //查找失敗
}

int Binsch1(struct ElemType A[], int low, int high, KeyType K)//非遞歸法
{//在 A[low] ~ A[hight]區間進行查找,low、hight初值分別爲 0 和 n-1
    if (low <= hight)
    {
        int mid = (low + high) / 2; //求中點元素下標
        if (K == A[mid].key)
            return mid;
        else if (K < A[mid].key)
            high = mid - 1;
        else 
            low = mid + 1;
    }
    else
        return -1; //查找失敗
}

二分查找分析:

二分查找可以用判定樹描述,二分查找的判定樹不僅是一棵二叉搜索樹,而且還是一棵理想平衡樹。

判定樹的高度 h 和結點數 n 的關係爲:

判定樹爲理想平衡樹,所以前 h-1 層都是滿的,在前 n-1 層中查找所有元素的比較次數之和爲  :

在第 h (最後一層)層中查找所有元素的比較次數之和爲 :

可得進行二分查找的平均查找長度爲:

時間複雜度爲:



二分查找的優點是比較次數少,速度快,但在查找之前要爲建立有序表付出代價,同時對有序表的插入和刪除也較爲費力。

二分查找適用於數據相對穩定的情況,而且只適用於順序存儲的有序表,不適用鏈接存儲的有序表。

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