折半查找算法及分析(手工過程)


折半查找的手工過程:

1.我需要查找的數是10;

給定:1  5  8  10  13 14  17  22  25  27  29  31  35  37  40  42  45  47  50  51  58

下標:0  1  2   3   4    5    6    7     8    9   10  11  12  13  14  15  16  17  18  19  20

   h               m                  t

   h    m          t

   h m  t

     h   t

     m  h

       m

這個手工過程到head = tail 時找到了。

我需要查找的數是29;

給定:1  5  8  10  13 14  17  22  25  27  29  31  35  37  40  42  45  47  50  51  58

下標:0  1  2   3   4    5    6    7     8    9   10  11  12  13  14  15  16  17  18  19  20

   h               m                  t

這個手工過程數在head < tail時程序停止,找到的是下標的那個數。

代碼如下:

#include<stdio.h>
#include<stdlib.h>
int binarySearch(int *arr,int count ,int data){
    int middle;
    int head = 0;
    int tail;
    tail =  count;
    while(arr[middle] != data){
        middle = (head + tail)/ 2;
        
        if(arr[middle] < data){
            head = middle + 1;
        }else if(arr[middle] > data){
            tail = middle - 1;
        }
    }    
    return middle;
    return -1;
}
int main(){
    int n = 0;
    int m ;
    int a[10]={1,4,8,9,16,17,19,20,25,27};
    printf("請輸入需要查找的數: ");
    scanf("%d",&n);
    m = binarySearch(a,10,n);
    printf("%d ",m);
    return 0;
}
 

這是一個簡單的折半處理,用的是一個簡單的數組

需要強調的是:

      如果要運用折半算法,數必須是有序的(升序或者降序)

      很多人都認為while(head > tail)這樣也是正確的,但是對於middle = data時條件一直成立就會出現問題的!


免責聲明!

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



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