一、一般的二分查找
一般的二分查找即,输出要查找元素在数组中的位置,这里的位置没有特殊限定,没有要求是数字第一次出现的位置,也没有要求是最后一次出现的位置。
int getPos(vector<int> A, int n, int val) { if (A.size()==0) { return NULL; } int low=0; int high=n-1; while(low<=high) //注意这里是小于等于 { if (A[(low+high)/2]>val) { high=(low+high)/2-1; } else if (A[(low+high)/2]<val) { low=(low+high)/2+1; } else return (low+high)/2; } return -1; }
二、二分查找之返回数字第一次出现的位置
由于需要的是第一次的出现的位置,所以代码上要做一点小的改动,如果依然按照一种的代码执行那么结果如下:
下面对代码做一些修改,修改的思想很简单,首先还是普通的二分查找,找到该元素后退出二分查找,然后以二分查找到的位置遍历向前,直到找到这个数第一次出现的位置就可以了。
int getPos(vector<int> A, int n, int val) { if (A.size()==0) { return NULL; } int low=0; int high=n-1; int mid=0; bool flag; //设置一个是否找到的标志 while(low<=high) { mid=(low+high)/2; if (A[mid]>val) { high=mid-1; } else if (A[mid]<val) { low=mid+1; } else { flag=true; //找到了了,保留找到的位置 break; } } if (flag) { while(mid>0&&A[mid-1]==val) //继续向前遍历,直到第一次出现的位置。 mid--; return mid; } return -1; }