你真的会写二分检索吗?

转载:http://blog.chinaunix.net/uid-1844931-id-3337784.html
前几天在论坛上看到有统计说有80%的程序员不能够写对简单的二分法。二分法不是很简单的吗? 这难道不是耸人听闻?

其实,二分法真的不那么简单,尤其是二分法的各个变种。 最最简单的二分法,就是从一个排好序的数组之查找一个key值。 如下面的程序:

#include <iostream>
using namespace std;
int binary_search(int *a,int n,int key)//注意a已按从小到大排序
{int left=0;int right=n-1;while (left<=right){int mid=(left+right)/2;//int mid=left+(right-left)>>1;if (a[mid]==key){return mid;}else if (a[mid]>key){right=mid-1;}else{left=mid+1;}}
return -1;}
int binary_search_first_equal(int *a,int n,int key)//注意a已按从小到大排序
{// 找出第一个与key相等的元素int left=0;int right=n-1;while (left<=right){int mid=(left+right)/2;//int mid=left+(right-left)>>1;if (a[mid]>=key){right=mid-1;}else{left=mid+1;}}if (a[left]==key&&left<n){return left;}return -1;}
int binary_search_last_equal(int *a,int n,int key)//注意a已按从小到大排序
{// 找出最后一个与key相等的元素int left=0;int right=n-1;while (left<=right){int mid=(left+right)/2;//int mid=left+(right-left)>>1;if (a[mid]>key){right=mid-1;}else{left=mid+1;}}if (a[right]==key&&right>=0){return right;}return -1;}
int binary_search_first_greater_equal(int *a,int n,int key)//注意a已按从小到大排序
{//  查找第一个等于或者大于Key的元素int left=0;int right=n-1;while (left<=right){int mid=(left+right)/2;//int mid=left+(right-left)>>1;if (a[mid]>=key){right=mid-1;}else{left=mid+1;}}return left;}
int binary_search_first_greater(int *a,int n,int key)//注意a已按从小到大排序
{//  查找第一个大于Key的元素int left=0;int right=n-1;while (left<=right){int mid=(left+right)/2;//int mid=left+(right-left)>>1;if (a[mid]>key){right=mid-1;}else{left=mid+1;}}return left;}
int binary_search_last_less_equal(int *a,int n,int key)//注意a已按从小到大排序
{//  查找最后一个等于或者小于Key的元素int left=0;int right=n-1;while (left<=right){int mid=(left+right)/2;//int mid=left+(right-left)>>1;if (a[mid]>key){right=mid-1;}else{left=mid+1;}}return right;}
int binary_search_last_less(int *a,int n,int key)//注意a已按从小到大排序
{//  查找最后一个小于Key的元素int left=0;int right=n-1;while (left<=right){int mid=(left+right)/2;//int mid=left+(right-left)>>1;if (a[mid]>=key){right=mid-1;}else{left=mid+1;}}return right;}void test1()
{int a[5]={1,2,3,4,5};printf(" test1 begins\t");if (binary_search(a,5,3)==2){printf("test passed\n");}else{printf("test failure\n");}
}
void test2()//查找第一个等于key的值
{int a[5]={1,2,3,3,5};printf(" test2 begins\t");if (binary_search_first_equal(a,5,3)==2){printf("test passed\n");}else{printf("test failure\n");}
}
void test3()//查找最后一个等于key的值
{int a[5]={1,2,3,3,5};printf(" test3 begins\t");if (binary_search_last_equal(a,5,3)==3){printf("test passed\n");}else{printf("test failure\n");}}
void test4()//查找第一个大于等于key的值
{int a[5]={1,2,3,3,5};printf(" test4 begins\t");if (binary_search_first_greater_equal(a,5,3)==2){printf("test passed\n");}else{printf("test failure\n");}}
void test5()//查找第一个大于key的值
{int a[5]={1,2,3,3,5};printf(" test5 begins\t");if (binary_search_first_greater(a,5,3)==4){printf("test passed\n");}else{printf("test failure\n");}
}
void test6()//查找最后一个小于等于key的值
{int a[5]={1,2,3,3,5};printf(" test6 begins\t");if (binary_search_last_less_equal(a,5,3)==3){printf("test passed\n");}else{printf("test failure\n");}
}
void test7()//查找最后一个小于key的值
{int a[5]={1,2,3,3,5};printf(" test7 begins\t");if (binary_search_last_less(a,5,3)==1){printf("test passed\n");}else{printf("test failure\n");}
}
void main()
{test1();test2();test3();test4();test5();test6();test7();}

结果:
test1 begins test passed
test2 begins test passed
test3 begins test passed
test4 begins test passed
test5 begins test passed
test6 begins test passed
test7 begins test passed
请按任意键继续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android listview动态加载网络图片不显示,Android Listview异步动态加载网络图片

Android Listview异步动态加载网络图片详见&#xff1a; http://blog.sina.com.cn/s/blog_62186b460100zsvb.html标签&#xff1a; Android SDK代码片段(5)[代码] (1)定义类MapListImageAndText管理ListViewItem中控件的内容01 package com.google.zxing.client.android.AsyncL…

C#-面向对象的多态思想 ---ShinePans

总结: 多态是面向对象的核心.---------能够理解为一个方法,多种实现, 在这里能够用虚方法,抽象类,接口能够实现多态 1.首先利用接口来实现多态: 接口相当于"功能,"接口能够实现多继承,分为 显式实现接口和隐式实现接口 keyword为interface格式: interface 接口名 { …

wxpy 0.1.2微信机器人 / 优雅的微信个人号API

微信机器人 / 优雅的微信个人号API&#xff0c;基于 itchat&#xff0c;全面优化接口&#xff0c;更有 Python 范儿。用来干啥一些常见的场景控制路由器、智能家居等具有开放接口的玩意儿跑脚本时自动把日志发送到你的微信加群主为好友&#xff0c;自动拉进群中跨号或跨群转发消…

c++中try catch的用法

在c中&#xff0c;可以直接抛出异常之后自己进行捕捉处理&#xff0c;如&#xff1a;&#xff08;这样就可以在任何自己得到不想要的结果的时候进行中断&#xff0c;比如在进行数据库事务操作的时候&#xff0c;如果某一个语句返回SQL_ERROR则直接抛出异常&#xff0c;在catch块…

const in c and cpp

http://c-faq.com/ansi/constasconst.html 转载于:https://www.cnblogs.com/invisible/p/3333575.html

android ndk调用出错,由于Android-NDK应用程序的权限问题,为什么fopen在本地方法中失败?...

errno 0;FILE *fp;fp fopen("jigar.txt","wb");if(fp NULL)__android_log_print(ANDROID_LOG_ERROR, APPNAME, "FOPEN FAIL with %d",errno);else__android_log_print(ANDROID_LOG_ERROR, APPNAME, "FOPEN pass ");它得到失败&…

循环队列

什么是队列&#xff1f; 队列(Queue)也是一种运算受限的线性表。它仅仅同意在表的一端进行插入&#xff0c;而在还有一端进行删除。同意删除的一端称为队头(front)&#xff0c;同意插入的一端称为队尾(rear)。 FIFO原则 队列具有先进先出原则&#xff0c;与栈的先进后出形成对照…

T(n) = 25T(n/5)+n^2的时间复杂度 计算方法

对于T(n) a*T(n/b)c*n^k;T(1) c 这样的递归关系&#xff0c;有这样的结论&#xff1a; if (a > b^k) T(n) O(n^(logb(a)));logb(a)b为底a的对数 if (a b^k) T(n) O(n^k*logn); if (a < b^k) T(n) O(n^k); a25; b 5 ; k2 ab^k 故T(n)O(n^k*logn)O(n^2*logn)…

android jar导出,Android项目导出jar包的小技巧

我们知道&#xff0c;可以通过如下设置将一个普通的Android工程转换成Android Library工程设置前后工程变化如下使用Ant编译时(通过android.bat update project 命令生成 build.xml)&#xff0c;普通的Android工程会生成apk文件&#xff0c;而Android Library工程只生成jar文件…

(五十九)iOS网络基础之UIWebView简易浏览器实现

【UIWebView网络浏览器】 通过webView的loadRequest方法可以发送请求显示相应的网站&#xff0c;例如&#xff1a; NSURL *url [NSURL URLWithString:"http://m.baidu.com"];// 创建请求数据NSURLRequest *request [NSURLRequest requestWithURL:url];// 向服务器发…

无心插柳OR志在必得?阿里推“来往”的意图

近年来&#xff0c;阿里巴巴在外围的动作确实不少&#xff0c;投资新浪微博、投资陌陌&#xff0c;配合阿里自身的一些战略调整&#xff0c;让人觉得这家公司似乎正在经历一场前所未有的“蜕变”。其实这也不难理解&#xff0c;在BAT三国演义中&#xff0c;任何一方都不能对其他…

wampserver的mysql启动与环境变量设置

安装好wampserver以后&#xff0c;mysql服务默认已经启动了。但是直接在命令行里输入"mysql"&#xff0c;系统会提示说 mysql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 这是因为没有增加“mysql”环境变量,请跳到第3步阅读。 如果之前已经安…

华为mate30怎么申请鸿蒙内测,华为新系统启动内测,mate30系列尝鲜,网友:羡慕...

原标题&#xff1a;华为新系统启动内测&#xff0c;mate30系列尝鲜&#xff0c;网友&#xff1a;羡慕一款手机是否好用&#xff0c;其实取决于两个方面&#xff0c;一个是硬件&#xff0c;另一个则是软件&#xff0c;大家在购机的时候往往最关注的就是硬件配置&#xff0c;因为…

VMware 11完全安装Mac OS X 10.10

----------------------------------------- 引用原文如下&#xff1a; VMware 11安装Mac OS X 10.10_百度经验 http://jingyan.baidu.com/article/ff411625b9011212e48237b4.html VM11安装Mac OS X 10.10 工具/原料 1.VMware Workstation 11 2.unlocker 203&#xff08;for OS…

两个二进制数异或的结果

【面试题目 -亢龙有悔整理】两个二进制数异或结果是多少? a^b |a-b| (按位相减取绝对值&#xff0c;再按位累加) 两个二进制数异或结果 是 这两个二进制数差的绝对值&#xff0c;即表达为如下&#xff1a; a^b |a-b| &#xff08;按位相减取绝对值&#xff0c;再按位累加&am…

Xcode debug时如何查看内存中的数据

对于IPhone开发/XCode的初学者&#xff0c;如何在调试时查看变量的值是很头痛的事情。因为Xcode的expression 经常无法正确显示变量的值。但是强大的GDB可以很方便的帮我们查看变量的值。当执行到某断点时&#xff0c;在GDB窗口中使用po就可以查看变量.(po print object) 1&am…

android另类工具,[置顶] android应用程序开发另解及Android SDK工具集的另类用法

转载请注明出处&#xff1a;LouisWang http://blog.csdn.net/louiswangbing/article/details/6606865相信对于广大Android应用开发爱好者来说&#xff0c;Android SDK工具集的大家都已经能够很熟练的使用&#xff0c;但是我这里要介绍的是SDK工具集的非常用使用方法&#xff0c…

谷歌2007年上交大考试最后一题解答

N个整数&#xff0c;求其中任意N-1个数的乘积中的最大的一个。 例如 3,2,1,则最大的是3*26 提示&#xff1a;整数包括0和负数 要求给出个比较有效率的算法 &#xff0c;不能用除法&#xff0c;只能用乘法。 从网上找一了一个解答比较好&#xff1a;http://bbs.csdn.net/topic…

Dynamic Web Module 3.0 requires Java 1.6 or newer报错

在项目的pom.xml的<build></build>标签中加入&#xff1a; <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> &…

STL学习笔记5--map and multimap

Maps是一种关联式容器&#xff0c;包含“关键字/值”对。 Multimaps和maps很相似&#xff0c;但是MultiMaps允许重复的元素。 简单介绍&#xff1a; 1、声明&#xff0c;首先包含头文件 “map” map <int,string> test1,test2;//map <int,string>::iterator it1,it…