关于二分查找
数组a是一个有序的非递减序列,查找与k有关的
如果能找到k,并且k的位置不唯一的话,返回最右边的那个下标。 如果找不到k,返回比它小的第一个数的下标。 #include<stdio.h> #define N 1100 int seach(int k,int a[],int left,int right) { int mid; while(left<=right) { mid=(left+right)/2; if(a[mid]>k) right=mid-1; else left=mid+1; } return right; } int main() { int a[N]={1,2,2,3,4,5,6}; printf("%d\n",seach(2,a,0,6)); return 0;}
数组a是一个有序的非递减序列,查找与k有关的 如果能找到k,并且k的位置不唯一的话,返回最左边的那个下标。 如果找不到k,返回比它大的第一个数的下标。
<pre name="code" class="cpp">#include<stdio.h> #define N 1100 int seach(int k,int a[],int left,int right) { int mid; while(left<=right) { mid=(left+right)/2; if(a[mid]>=k) right=mid-1; else left=mid+1; } return left; } int main() { int a[N]={1,2,2,3,4,5,6}; printf("%d\n",seach(2,a,0,6)); return 0;}
/*数组a是一个有序的非递减序列,查找比k小的最大的数的下标 */ #include<stdio.h> #define N 1100 int seach(int k,int a[],int left,int right) { int mid; while(left<=right) { mid=(left+right)/2; if(a[mid]>=k) right=mid-1; else left=mid+1; } return right; } int main() { int a[N]={1,2,2,3,4,5,6}; printf("%d\n",seach(5,a,0,6)); return 0;}
/*数组a是一个有序的非递减序列,查找比k大的最小数的下标 */ #include<stdio.h> #define N 1100 int seach(int k,int a[],int left,int right) { int mid; while(left<=right) { mid=(left+right)/2; if(a[mid]>k) right=mid-1; else left=mid+1; } return left; } int main() { int a[N]={1,2,2,3,4,5,6}; printf("%d\n",seach(2,a,0,6)); return 0;}