二分查找(折半查找)


二分查找又稱折半查找,前提要求數據序列呈現線性結構,即必須是經過排序的。

基本思路:

      在一組有序序列中,取中間值與給定關鍵字進行比較,如果給定關鍵字大於該值關鍵字,則要查找的關鍵字位於有序序列的后半部分;若給定小於該值,則要查找的關鍵字位於有序序列的前半部分。每次將有序序列的長度縮小一半之后,再從中間位置的記錄進行比較,依次反復進行。

查找過程如下:

1、查找初始化為low=1、high=length。其中low和high是兩個位置指示器,分別指向當前序列的第一個和最后一個值;

2、對當前有序序列做如下處理:

(1)求當前序列的中間位置:mid=(low+length)/2,mid為中間值的位置指示器;

(2)將要查找的查詢關鍵字與mid指示的值進行比較。若相等,查找結束,返回中間位置的值mid;若大於該值,則將查找范圍縮短為該序列的后半部分,此時改變low=mid+1,而high值不變;若小於該值,則將查找范圍縮短為該序列的前半部分,此時改變high=mid-1,而low值不變。

(3)重復執行過程(2)直至找到待查關鍵字,返回此值的位置mid,否則返回0。

 

#include<stdio.h>
#include<stdlib.h>

#define max_len 20

typedef struct
{
    int key;
    char data;
}Record;

typedef struct
{
    Record r[max_len+1];
    int length;
}seqTable;

int BinarySearch(seqTable st,int k)
{
    int low,high,mid;

    low=1;
    high=st.length;


    while(low<=high)
    {
        mid=(low+high)/2;
        
        if(st.r[mid].key<k)
            low=mid+1;
        else
        {
            if(st.r[mid].key>k)
                high=mid-1;
            else
                break;
        }
    }
    if(low>high)
        return 0;
    else
        return mid;
}

void main()
{
    seqTable st;
    int i;  
    int len; //定義變量為線性表的長度
    int ch;  //定義變量為線性表的輸入參數
    int kk; //定義變量為查詢關鍵字
    int res; //定義變量為查找函數返回值

    printf("二分查找演示操作!\n");
    printf("輸入線性表的長度:");
    scanf("%d",&len);

    st.length=len;
    printf("輸入%d個記錄的關鍵字值(用空格隔開):\n",len);
    for(i=1;i<=len;i++)
    {
        scanf(" %d",&ch);
        st.r[i].key=ch;
    }
    printf("輸入查詢關鍵字:");
    scanf("%d",&kk);
    res=BinarySearch(st,kk);
    
    if(res==0)
        printf("該查找表中不存在此記錄!\n");
    else
        printf("該記錄位於該查找表中的第%d個!",res);

    printf("\n");
    system("pause");

}

結果顯示:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM