你真的會寫二分檢索嗎?

轉載: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.pswp.cn/news/259373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259373.shtml
英文地址,請注明出處:http://en.pswp.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…