二分查找 模板

 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         else
12             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         else
12             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             else
101                 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 }

Here

当然你可以调用C中的<stdlib.h>中的qsort或C++中的<algorithm>sort。二分查找就用C中的<stdlib.h>中的bsearch。

二分查找 模板,布布扣,bubuko.com

时间: 2024-10-20 08:03:37

二分查找 模板的相关文章

二分查找模板

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[1000100]; int search(int left,int right,int v) { int mid=(left+right)/2; if(left>right) return -1; if(a[mid]==v) return mid; el

二分——二分查找算法模板

转自:二分查找算法模板 二分模板一共有两个,分别适用于不同情况.算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值. 版本1当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1. C++ 代码模板: int bsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1;

二分查找、三分查找求极点、二分求等比数列【模板】

二分查找: int a[110],N; int BinarySearch(int *a,int x) { int Left = a[1]; int Right = a[N]; while(Left <= Right) { int mid = (Left+Right)>>1; if(a[mid] == x) return mid; else if(a[mid] > x) Right = mid - 1; else Left = mid + 1; } return -1; } 三分查找

【模板】二分查找

二分查找就是指对于一个有序数列,取其中间值,与要查找的值比较,若大于,则舍弃右半部分序列,若小于则舍弃左半部分序列,其复杂度是O(logn)的.二分查找看似简单,但到处都说要想不出错很难. inline int search(int *arr,int size,int key) { //内联查找函数,参数为序列数组,数组大小及查找的值     int left=0,right=size; //定义整型变量left置为0,right置为size     int mid; //定义整型变量mid  

【转】你真的会二分查找吗?

转自:http://blog.csdn.net/int64ago/article/details/7425727 红色字体为我对此转载文章的批注 看到这个标题无论你是处于怎样的心理进来看了,我觉得都是值得的.因为这个问题太简单,任何一个开始接触"真正"算法基本都是从二分查找开始的.至于二分查找都不知道是什么的可以先去找别的资料看下,再来看这篇文章.既然很简单,那么我们开始一起写一个吧,要求是对num[]={1,2,2,4,4,8,10}不减序列在区间[0,7)进行查找,当然我们得首先保

(转载)你真的会二分查找吗?

原文地址 :http://blog.csdn.net/int64ago/article/details/7425727 看到这个标题无论你是处于怎样的心理进来看了,我觉得都是值得的.因为这个问题太简单,任何一个开始接触“真正”算法基本都是从二分查找开始的.至于二分查找都不知道是什么的可以先去找别的资料看下,再来看这篇文章.既然很简单,那么我们开始一起写一个吧,要求是对num[]={1,2,2,4,4,8,10}不减序列在区间[0,7)进行查找,当然我们得首先保证要查找的数e满足:num[0] <

养成良好的编程风格--论二分查找的正确姿势

摘自:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度.在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度. 时间复杂度按优劣排差不多集中在: O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n) 到目前位置,似乎我学到的算法中,时间复杂度

杭电 1025 Constructing Roads In JGShining&#39;s Kingdom(二分查找)

http://acm.hdu.edu.cn/showproblem.php?pid=1025 Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15515    Accepted Submission(s): 4412 Problem Descriptio

二分查找总结及部分Lintcode题目分析 1

进行二分查找课程回顾与总结,包括以下几个方面,二分法的模板总结和解题思路.应用. 二分法模板总结classical binary search: 1. 必须要做的排除极端情况,也就是数组(用A表示)不存在即A == None或者 A为空,即len(A) == 0 的情况. 2. 二分法核心找的是mid值,并判断这个mid是否跟我们要找的target一致,或者和target之间的关系,所以要先判断start和end.为start和end赋值,start = 0, end = len(A) - 1