·什么是折半查找
·当我们在一堆有序数组中间查找一个数的时候,先将中间的数与查找数进行比较。如果中间数大于我们要查找的数,则在中间左半边进行查找;同样的,如果中间数小于我们要查找的数,则在中间往右半边再次进行查找。重复以上的过程,直到满足,如果不满足,则查找失败。
·条件:元素必须按照大小有序排列。
·图示
·那我们实现的思路是什么呢?我们定义三个变量,分别指向这个数组的最左边以及最右边还有中间,将中间的数与查找数进行比较。根据情况缩减范围,即改变左边或者右边变量的值,再次进行比较。过程如下图所示:
·函数实现
int find(int arr[], int a, int left, int right) { while(left<=right) { int mid = left+(right-left)/2; if(arr[mid] == a) { return mid; } else if(arr[mid]>a) { right = mid-1; } else { left = mid+1; } } return -1; }
·当缩减范围的时候并不是把mid的值赋给left或者right,因为mid已经比较过了,所以我们把mid进行--或者++处理。
·我们函数返回的int值即为所要查找的数在数组中的位置