1. 程式人生 > >二分查詢的演算法思想和實現過程

二分查詢的演算法思想和實現過程

1.二分查詢:

又稱為 折半查詢,二分查詢,適合對已經排序好的資料集合進行查詢,時間複雜度O(log2n),效率高。假設有一升序的資料集合,先找出升序集合中最中間的元素,將資料集合劃分為兩個子集,將最中間的元素和關鍵字key進行比較,,如果等於key則返回,如果大於關鍵字key,則在前一個數據集合中查詢,否則在後一個子集中查詢,直到找到為止,如果沒找到則返回-1;

2.演算法步驟描述:

(1)首先確定整個查詢區間的中間位置mid=(low+high)/2;

(2)用待查關鍵字值與中間位置關鍵字值進行比較;

若相等,則查詢成功;

若大於,則在後半個區域中繼續進行折半查詢。

若小於,則在前半個區域中繼續進行折半查詢。

查詢成功,返回關鍵字所在陣列下標,沒找到返回-1;

3.程式碼:

#include<stdio.h>
#include<stdlib.h>
//二分查詢非遞迴方式
int HalfSearch(int a[],int low,int high,int key)
{
    int mid;
    while(low<=high)
    {
      mid=(low+high)/2;//二分點
        if(a[mid]==key) return mid;
        else if(a[mid]<key) low=mid+1;
        else high=mid-1;
    }
    return -1;
}
//二分查詢遞迴方式


int HalfSearch1(int a[],int low,int high,int key)
{
    int mid;
    if(low>high) return -1;//沒找到,遞迴結束
    else{
        mid=(low+high)/2;
        if(a[mid]==key) return mid;//找到了,遞迴結束
        else if(a[mid]<key)  return HalfSearch(a,mid+1,high,key);//右遞迴
        else return HalfSearch(a,low,mid-1,key);//左遞迴

    }
}
int main(void)
{
    int a[10]={12,22,34,65,76,78,89,90,121,145};
    int n;
    int key;
    printf("enter data to key:\n");
    scanf("%5d",&key);
    n=HalfSearch1(a,0,9,key);
    if(n==-1) printf("not found!\n");//沒找到
    else  printf("key=%d",a[n]);
    return 0;
}