程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c/c++常用算法(13) -- 基本查找算法

c/c++常用算法(13) -- 基本查找算法

編輯:C++入門知識

查找的概念


查找表(SearchTable):相同類型的數據元素(對象)組成的集合,每個元素通常由若干數據項構成。

關鍵字(Key,碼):數據元素中某個(或幾個)數據項的值,它可以標識一個數據元素。若關鍵字能唯一標識一個數據元素,則關鍵字稱為主關鍵字;將能標識若干個數據元素的關鍵字稱為次關鍵字。


查找/檢索(Searching):根據給定的K值,在查找表中確定一個關鍵字等於給定值的記錄或數據元素。

◆ 查找表中存在滿足條件的記錄:查找成功;結果:所查到的記錄信息或記錄在查找表中的位置。

◆查找表中不存在滿足條件的記錄:查找失敗。


查找有兩種基本形式:靜態查找和動態查找。

靜態查找(Static Search):在查找時只對數據元素進行查詢或檢索,查找表稱為靜態查找表。

動態查找(Dynamic Search):在實施查找的同時,插入查找表中不存在的記錄,或從查找表中刪除已存在的某個記錄,查找表稱為動態查找表。

查找的對象是查找表,采用何種查找方法,首先取決於查找表的組織。查找表是記錄的集合,而集合中的元素之間是一種完全松散的關系,因此,查找表是一種非常靈活的數據結構,可以用多種方式來存儲。


根據存儲結構的不同,查找方法可分為三大類:

① 順序表和鏈表的查找:將給定的K值與查找表中記錄的關鍵字逐個進行比較,找到要查找的記錄;

② 散列表的查找:根據給定的K值直接訪問查找表,從而找到要查找的記錄;

③ 索引查找表的查找:首先根據索引確定待查找記錄所在的塊,然後再從塊中找到要查找的記錄。

查找方法評價指標

查找過程中主要操作是關鍵字的比較,查找過程中關鍵字的平均比較次數(平均查找長度ASL:AverageSearchLength)作為衡量一個查找算法效率高低的標准。ASL定義為:


\


<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PC9wPgo8cD4gICAgICAgxuTW0KO6PC9wPgo8cD4gICAgICAgICAgICAgIFBpo7qy6dXStdppuPa8x8K8tcS4xcLKo6yyu8qn0ruw49DUo6zIz86qsunV0sO/uPa8x8K8tcS4xcLKz+C1yKOsvLRQMT1QMj2hrT1Qbj0xL24go7s8L3A+CjxwPiAgICAgICAgICAgICAgQ2mjurLp1dK12mm49rzHwrzQ6NKqvfjQ0LHIvc+1xLTOyv2hozwvcD4KPGJyPgo8cD48YnI+CjwvcD4KPGgxPtK7oaK+ssyssunV0jwvaDE+CjxwPjxicj4KPC9wPgo8aDI+MS7Ls9DysunV0jwvaDI+CjxwPjxicj4KPC9wPgo8cD48L3A+CjxwPjEuMSAgsunV0su8z+s8L3A+CiAgICAgICC007HttcTSu7bLv6rKvNbwuPa9q7zHwry1xLnYvPzX1rrNuPi2qEsmIzIwNTQwO7340NCxyL3Po6zI9MSzuPa8x8K8tcS52Lz819a6zbj4tqhLJiMyMDU0MDvP4LXIo6yy6dXSs8m5pqO7t/HU8qOsyPTJqMPozerV+7j2se2jrMjUyLvDu9PQ1dK1vc/g06a1xLzHwryjrNTysunV0sqnsNyhozxicj4KPHA+PGJyPgo8L3A+CjxwPjEuMiAgyr7A/To8L3A+CjxwPjxicj4KPC9wPgo8cD48aW1nIHNyYz0="http://www.Bkjia.com/uploadfile/Collfiles/20140106/20140106140845243.jpg" alt="\">


1.3 實例代碼:

#include 
#include 

#define N 15

int SearchFun(int a[],int n,int x)
{
    int i,f = -1;
    
    for (i = 0; i
運行結果:

\


2. 折半查找(Binary Search)


折半查找又稱為二分查找,是一種效率較高的查找方法。

前提條件:查找表中的所有記錄是按關鍵字有序(升序或降序) 。

查找過程中,先確定待查找記錄在表中的范圍,然後逐步縮小范圍(每次將待查記錄所在區間縮小一半),直到找到或找不到記錄為止。


2.1 查找思想

用Low、High和Mid表示待查找區間的下界、上界和中間位置指針,初值為Low=1,High=n。

⑴ 取中間位置Mid:Mid=?(Low+High)/2?;

⑵ 比較中間位置記錄的關鍵字與給定的K值:

① 相等:查找成功;

② 大於:待查記錄在區間的前半段,修改上界指針:High=Mid-1,轉⑴;

③ 小於:待查記錄在區間的後半段,修改下界指針:Low=Mid+1,轉⑴;

直到越界(Low>High),查找失敗。


2.2舉例

如圖(a),(b)所示:


\


\


2.3 實例代碼:

#include 
#include 

#define N 15

void QuickSort(int *arr,int left,int right)     //快速排序算法
{
    int f,t;
    int rtemp,ltemp;
    
    ltemp = left;
    rtemp = right;
    f = arr[(left + right)/2];                  //確定分界值
    while (ltemp < rtemp)
    {
        while (arr[ltemp] < f)
        {
            ++ltemp;
        }
        
        while (arr[rtemp] > f)
        {
            --rtemp;
        }
        
        if (ltemp <= rtemp)
        {
            t = arr[ltemp];
            arr[ltemp] = arr[rtemp];
            arr[rtemp] = t;
            --rtemp;
            ++ltemp;
        }
    }
    
    if (ltemp == rtemp)
    {
        ltemp++;
    }
    
    if (left < rtemp)
    {
        QuickSort(arr, left, ltemp-1);
    }
    
    if (left < rtemp)
    {
        QuickSort(arr, rtemp+1, right);
    }
    
}

int SearchFun(int a[],int n,int x)              //折半查找
{
    int mid,low,high;
    low = 0;
    high = n - 1;
    while (low <= high)
    {
        mid = (low + high)/2;
        if (a[mid] == x)
            return mid;
        
        else if(a[mid] > x)
            high = mid -1;
        
        else
            low = mid + 1;
    }
    
    return -1;
}

int main(int argc, const char * argv[])
{
    // std::cout << "Hello, World!\n";
    int x,n,i;
    int shuzu[N];
    
    srand(time(NULL));
    
    printf("折半查找算法演示!\n");
    printf("排序前:\n");
    
    for (i = 0; i
運行結果:



二、動態查找


動態查找可參考

c/c++常用算法 -- 數據結構.


參考書籍:《C/C++常用算法手冊》 《數據結構-清華大學嚴蔚敏》

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved