折半查找的手工過程:
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時條件一直成立就會出現問題的!
