zoukankan      html  css  js  c++  java
  • 二分查找 模板

     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
    ",b);
     92             else if(b == -1)// 2
     93                 printf("%d
    ",a);
     94             else if(a==b)
     95                 printf("%d
    ",a);
     96             else if(k-a == b-k)
     97                 printf("%d %d
    ",a,b);
     98             else if(k-a>b-k)
     99                 printf("%d
    ",b);
    100             else
    101                 printf("%d
    ",a);
    102         }
    103         //1和2两条语句是非常重要的不然的话可以测试一下 n=1 ,m=5,X[0]=1,k=0这组数据。
    104         printf("
    ");
    105     }
    106     return 0;
    107 }
    Here

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


    作者:blueppo
    出处:http://www.cnblogs.com/Yan-C/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    02-NSArray、NSSet、NSDictionary 集合类
    01-结构体NSRange、NSPoint、NSSize、NSRect、及NSString简介
    13-Objective-C特有语法:协议protocol
    12-Objective-C特有语法:(高效率)block数据类型
    Xcode编译器特性:ARC(Automatic Reference Counting)
    11-Objective-C特有语法:内存管理总结
    10-Objective-C特有语法:Category、类对象、description、SEL、NSLog输出增强
    09-Objective-C特有语法:万能指针id及构造方法
    通配符 正则常用对比
    window 远程登录linux
  • 原文地址:https://www.cnblogs.com/Yan-C/p/3908263.html
Copyright © 2011-2022 走看看