折半查找

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

 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的时候,要是查找第一个数的话是查不到的,所以必须带等号.

posted @ 2014-07-26 21:52  Programmer-cjr  阅读(201)  评论(0编辑  收藏  举报