折半查找算法及分析(手工过程)
折半查找的手工过程:
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时条件一直成立就会出现问题的!