首页 > 代码库 > 二分查找 模板
二分查找 模板
1 int bsearch(int l, int h, int k)//二分查找函数 2 { 3 int i, mid; 4 5 while(l<=h){ 6 mid = l+(h-l)/2; 7 if(X[mid]>k) 8 h = mid-1; 9 else if(X[mid]<k)10 l = mid+1;11 else 12 break;13 }14 return mid;15 }
1 int max_bsearch(int l, int h, int k)//求上界 2 { 3 int i, mid, ans = -1; 4 5 while(l<=h){ 6 mid = l+(h-l)/2; 7 if(X[mid]>=k){ 8 h = mid-1; 9 ans =X[mid];10 }11 else12 l = mid+1;13 }14 return ans;15 }
1 int min_bsearch(int l, int h,int k)//求下界 2 { 3 int i, mid, ans = -1; 4 5 while(l<=h){ 6 mid = l+(h-l)/2; 7 if(X[mid]<=k){ 8 l = mid+1; 9 ans = X[mid];10 }11 else12 h = mid-1;13 }14 return ans;15 }
1 void Quick_sort(int l, int h)//复习一下快排 2 { 3 int i = l, j = h; 4 int v = X[l]; 5 6 if(l>=h) 7 return ; 8 while(i<j){ 9 while(i<j && X[j]>=v)j--;10 X[i] = X[j];11 while(i<j && X[i]<=v)i++;12 X[j] = X[i];13 }14 X[i] = v;15 Quick_sort(l,i-1);16 Quick_sort(i+1,h);17 }
附上一道练习题
代码在这
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #define ll long long 6 7 using namespace std; 8 9 int X[1000003]; 10 11 void Quick_sort(int l, int h)//复习一下快排 12 { 13 int i = l, j = h; 14 int v = X[l]; 15 16 if(l>=h) 17 return ; 18 while(i<j){ 19 while(i<j && X[j]>=v)j--; 20 X[i] = X[j]; 21 while(i<j && X[i]<=v)i++; 22 X[j] = X[i]; 23 } 24 X[i] = v; 25 Quick_sort(l,i-1); 26 Quick_sort(i+1,h); 27 } 28 29 int max_bsearch(int l, int h, int k)//求上界 30 { 31 int i, mid, ans = -1; 32 33 while(l<=h){ 34 mid = l+(h-l)/2; 35 if(X[mid]>=k){ 36 h = mid-1; 37 ans =X[mid]; 38 } 39 else 40 l = mid+1; 41 } 42 return ans; 43 } 44 45 int bsearch(int l, int h, int k)//二分查找函数 46 { 47 int i, mid; 48 49 while(l<=h){ 50 mid = l+(h-l)/2; 51 if(X[mid]>k) 52 h = mid-1; 53 else if(X[mid]<k) 54 l = mid+1; 55 else 56 break; 57 } 58 return mid; 59 } 60 61 int min_bsearch(int l, int h,int k)//求下界 62 { 63 int i, mid, ans = -1; 64 65 while(l<=h){ 66 mid = l+(h-l)/2; 67 if(X[mid]<=k){ 68 l = mid+1; 69 ans = X[mid]; 70 } 71 else 72 h = mid-1; 73 } 74 return ans; 75 } 76 77 int main() 78 { 79 int n, m, i, j, k, a, b; 80 81 while(scanf("%d %d",&n,&m)==2){ 82 for(i=0;i<n;i++) 83 scanf("%d",X+i); 84 Quick_sort(0,n-1); 85 for(i=0;i<m;i++) 86 { 87 scanf("%d",&k); 88 a = min_bsearch(0,n-1,k); 89 b = max_bsearch(0,n-1,k); 90 if(a == -1)// 1 91 printf("%d\n",b); 92 else if(b == -1)// 2 93 printf("%d\n",a); 94 else if(a==b) 95 printf("%d\n",a); 96 else if(k-a == b-k) 97 printf("%d %d\n",a,b); 98 else if(k-a>b-k) 99 printf("%d\n",b);100 else101 printf("%d\n",a);102 }103 //1和2两条语句是非常重要的不然的话可以测试一下 n=1 ,m=5,X[0]=1,k=0这组数据。104 printf("\n");105 }106 return 0;107 }
当然你可以调用C中的<stdlib.h>中的qsort或C++中的<algorithm>sort。二分查找就用C中的<stdlib.h>中的bsearch。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。