二分查找/折半查找

二分查找又叫折半查找。

前提:数组是有序的。

思想:1、每次都拿中间的数的key进行比较,如果相等,找到;

        2、如果key > 中间数,说明key在中间数的右边,接着拿右边的中间数和key比较;

        3、如果key < 中间数,说明key在中间数的左边,接着拿左边的中间数和key比较;

        4、循环上述过程;

 

啥也不说了,上代码:

 1 #include <stdio.h>
 2 
 3 int main(int argc, const char * argv[]) {
 4     
 5     // 定义数组
 6     int arr[] = {10,45,67,89,90,122,456,789,999};
 7     
 8     // 查找789在这个数组中的下标
 9     int key = 789;
10     
11     int len = sizeof(arr) / sizeof(arr[0]);
12     
13     int minIndex = 0;
14     int maxIndex = len - 1;
15     int middleIndex = len / 2; // 中间数的下标
16     
17     // 判断中间的数是否等于key
18     if(key == arr[middleIndex]){
19         printf("the key's index is %d",middleIndex);
20         return 0;
21     }
22     
23     // 如果不相等就判断大小
24     while (key != arr[middleIndex]) {
25         if(key < arr[middleIndex]){ // 说明key在中间数的左边
26             maxIndex = middleIndex - 1; // 最大下标改为中间数下标的前一个元素的下标
27         }
28         else if(arr[middleIndex < key]){ // 说明key在中间数的右边
29             minIndex = middleIndex + 1; // 最小下标改为中间数下标的后一个元素的下标
30         }
31         else{ // 说明key = arr[middleIndex]
32             printf("the key's index is %d",middleIndex);
33             return 0;
34         }
35         middleIndex = (minIndex + maxIndex) / 2;
36     }
37     
38     printf("没有找到要查找的数");
39     
40     return 0;
41 }

 

posted @ 2016-11-04 22:24  小课桌  阅读(275)  评论(0编辑  收藏  举报