折半查找
首先,这个算法的确很简单,但是写了很多次还是自己不能完全的写对.上码分析:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 #define LENGTH 4 // 数组的长度 6 #define MAX 10 // 随机数的最大值 7 8 /** 折半查找的例子 9 * 先随机生成一个数组然后进行从小到大排序,然后折半查找输入的数 10 * @date 2014-07-26 11 */ 12 13 void bubblesort(int *data) 14 { 15 int i,j,t; 16 for(i = 0; i < LENGTH; i++) 17 { 18 for(j = 0; j < LENGTH -1 - i; j++) 19 { 20 if(data[j] > data[j+1]) 21 { 22 t = data[j]; 23 data[j] = data[j+1]; 24 data[j+1] = t; 25 } 26 } 27 } 28 } 29 int binSearch(int *data,int n,int num) 30 { 31 int index,start = 0,end = n-1; 32 33 while(start <= end) 34 { 35 index = (start + end)/2; 36 if(data[index] < num) // 要找的数在右边 37 start= index+1; 38 else if(data[index] > num) // 要找的数在左边 39 end = index-1; 40 else 41 return index; 42 } 43 return -1; 44 } 45 int main() 46 { 47 int i,*data = NULL,num,result; 48 data = malloc(sizeof(int)*LENGTH); 49 50 srand((int)time(0)); 51 for(i = 0; i < LENGTH ; i++) 52 data[i] = 1+ (int)(MAX*rand()/(RAND_MAX+1.0)); 53 54 bubblesort(data); 55 56 printf("\n请输入(<%d)",MAX); 57 scanf("%d",&num); 58 59 result = binSearch(data,LENGTH,num); 60 61 if(result > -1) 62 printf("%d",result); 63 else 64 printf("NO such number in the array!"); 65 return 0; 66 }
分析: 一直都知道核心那部分,判断数大往右查,数小往左查.
困惑点: 开始一直不知道循环结束的条件.
这次我最开始就写错了,当找到数的时候我只是 i = index,然后循环就退不出来了.
如果此例中是 start < end 也不对,当数组长度是4的时候,要是查找第一个数的话是查不到的,所以必须带等号.