-
问题
在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=-1;(这里为了区分与下标0的区别改为了-1) -
解析
如何在一个有序的数组中查找出一个元素,无外就几种情况,要么采用顺序查找,要么采用分治思想逐步排查或者使用散列值等进行查找。
顺序查找没什么好解释的就是从数组第一个元素开始遍历,如果没有找到要找的就遍历到最后一个然后结束。
二分查找,是基于有序序列的查找算法。通过折中的思想查找元素mid=[left+right]/2。
3. 设计
int binary_search(int a[],int left,int right,int num){
int mid;
while(left<=right){
mid = (left+right)/2;
if(a[mid]==num){
return mid;
}
else if(a[mid]>num){
right = mid - 1;
}
else{
left = mid + 1;
}
}
return -1;
}
int arr_search(int a[],int len,int num){
for(int i = 0;i<len;i++){
if (a[i] == num)
{
return i;
}
}
return -1;
}
4.分析
顺序查找是从第一个一直遍历至最后一个复杂度为O(n) ,而二分查找是O(logn),复杂度要优于顺序查找。
5.源码