二分查找/折半查找
二分查找又叫折半查找。
前提:数组是有序的。
思想: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 }