首页 > 代码库 > 折半查找

折半查找

首先,这个算法的确很简单,但是写了很多次还是自己不能完全的写对.上码分析:

 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-2611     */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         else41            return index;42     }43     return -1;44 }45 int main()46 {47     int i,*data =http://www.mamicode.com/ NULL,num,result;48     data = http://www.mamicode.com/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     else64         printf("NO such number in the array!");65     return 0;66 }

分析: 一直都知道核心那部分,判断数大往右查,数小往左查. 

      困惑点: 开始一直不知道循环结束的条件.

                这次我最开始就写错了,当找到数的时候我只是 i = index,然后循环就退不出来了.

                如果此例中是 start < end 也不对,当数组长度是4的时候,要是查找第一个数的话是查不到的,所以必须带等号.

折半查找