二分查找
2013-07-01 16:12
288 查看
#include "stdio.h" int bsearch (int *A,int x,int y,int v) { int m; while (x < y) {//[x,y) m = x + (y - x) /2; // printf ("[%d,%d)=%d\n",x,y,m); if (A[m] == v) { return m; }else if (A[m] > v) { y = m; }else { x = m + 1; } } return -1; } //求上界 //当v存时,返回第一个它出现的位置,否则返回一个下标i,在i处插入v([i],[i+1]...向后移动一个位置) int lower_bound (int *A,int x,int y,int v) { int m; while (x < y) { m = x + (y-x) / 2; if (A[m] >= v) { y = m; }else { x = m + 1; } } return x; } //求下界 int upper_bound (int *A,int x,int y,int v) { int m; while (x < y) { m = x + ( y-x ) / 2; if (A[m] <= v) { x = m + 1; }else { y = m; } } return x; } //lower_bound的返回值为L,upper_bound的返回值为R,则出现v的子序列为[L,R),当L=R的时候区间为空。 int main () { int A[] = {-1,1,1,1,3}; int L,R; int index = bsearch (A,0,5,1); printf("%d\n",index); L = lower_bound (A,0,5,1); printf ("%d\n",L); R = upper_bound (A,0,5,1); printf ("%d\n",R); printf ("the area of v is[%d,%d)",L,R); return 0; } /*output: *2 *1 *4 *the area of v is[1,4) */
eg:
给出n个整数xi和m个询问,对于每个询问(a,b),输出闭区间[a,b]内整数的个数。
#include "stdio.h" #define MAX 200 int num[MAX]; int num2[MAX]; int lower_bound (int *A,int x,int y,int v) { int m; while (x < y) { m = x + (y-x) / 2; if (A[m] >= v) { y = m; }else { x = m + 1; } } return x; } //求下界 int upper_bound (int *A,int x,int y,int v) { int m; while (x < y) { m = x + ( y-x ) / 2; if (A[m] <= v) { x = m + 1; }else { y = m; } } return x; } //排序 void sort (int *A,int x,int y,int *B) { if (y - x == 1) { return; }else { int m = x + (y - x) / 2; int p = x; int q = m; int i = 0; sort (A,x,m,B); sort (A,m,y,B); printf ("[%d %d)\n",x,y); while (p < m || q < y) { if ( q < y &&( p >= m || A[q] <= A[p])) { B[i++] = A[q++]; }else { B[i++] = A[p++]; } } q = 0; for (i = x;i < y;i++) { A[i] = B[q++]; } } } int main () { int n,m; int i; int a,b; int result; scanf ("%d%d",&n,&m); for (i = 0;i < n;i++) { scanf ("%d",num+i); } sort (num,0,n,num2); for (i = 0;i < n;i++) { printf ("%d ",num[i]); } printf ("\n"); for (i = 0; i < m;i++) { scanf ("%d%d",&a,&b); result = upper_bound (num,0,n,b) - lower_bound(num,0,n,a); printf ("%d\n",result); } return 0; }
相关文章推荐
- 1133 : 二分·二分查找之k小数
- HDOJ2199Can you solve this equation?【二分查找】
- BinarySearch(二分查找)
- 二分查找在array中找数
- 二分查找:hdu 2141 Can you find it?
- [POJ](3258)River Hopscotch ---二分查找+贪心(查找+贪心)
- 3.11 二分查找
- 二分搜索查找
- 在数组中进行二分查找找出某数在数组中的下标
- 二分查找要注意的问题
- 二分查找(待补充)
- PAT--1085 Perfect Sequence(二分查找)
- 二分查找
- 二分查找的递归算法程序
- 折半,二分查找问题
- 你真的会二分查找吗?
- 二分查找
- 二分查找问题全集OK
- 利用二分收索查找该数在该数组所在的位置,前提是要保证改数组是有序的
- 二分查找的递归和非递归