改進的二分查找

 1 import java.util.Comparator;
 2 
 3 public class MyUtil {
 4 
 5    public static <T extends Comparable<T>> int binarySearch(T[] x, T key) {
 6       return binarySearch(x, 0, x.length- 1, key);
 7    }
 8 
 9    // 使用循環實現的二分查找
10    public static <T> int binarySearch(T[] x, T key, Comparator<T> comp) {
11       int low = 0;
12       int high = x.length - 1;
13       while (low <= high) {
14           int mid = (low + high) >>> 1;
15           int cmp = comp.compare(x[mid], key);
16           if (cmp < 0) {
17             low= mid + 1;
18           }
19           else if (cmp > 0) {
20             high= mid - 1;
21           }
22           else {
23             return mid;
24           }
25       }
26       return -1;
27    }
28 
29    // 使用遞歸實現的二分查找
30    private static<T extends Comparable<T>> int binarySearch(T[] x, int low, int high, T key) {
31       if(low <= high) {
32         int mid = low + ((high -low) >> 1);
33         if(key.compareTo(x[mid])== 0) {
34            return mid;
35         }
36         else if(key.compareTo(x[mid])< 0) {
37            return binarySearch(x,low, mid - 1, key);
38         }
39         else {
40            return binarySearch(x,mid + 1, high, key);
41         }
42       }
43       return -1;
44    }
45 }

上面的代碼中給出了折半查找的兩個版本,一個用遞歸實現,一個用循環實現。需要注意的是計算中間位置時不應該使用(high+ low) / 2的方式,因為加法運算可能導致整數越界,這里應該使用以下三種方式之一:low + (high - low) / 2或low + (high – low) >> 1或(low + high) >>> 1(>>>是邏輯右移,是不帶符號位的右移)

轉自:https://blog.csdn.net/jackfrued/article/details/44921941

轉載于:https://www.cnblogs.com/chenglangpofeng/p/10676812.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277993.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277993.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277993.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LuckyDraw app被評為Microsoft365 App Award

今天查了一下LuckyDraw app&#xff0c;突然發現我上半年開發的Teams app: LuckyDraw&#xff0c;竟然多了一個勛章圖標&#xff0c;點進去一看是微軟給我的app評了一個”Microsoft 365 App Award”。Super surprise!!&#x1f60d;&#x1f60d;&#x1f60d; 看來我必須要抓…

Python學習筆記__10.4章 進程VS線程

# 這是學習廖雪峰老師python教程的學習筆記1、概覽我們介紹了多進程和多線程&#xff0c;這是實現多任務最常用的兩種方式。現在&#xff0c;我們來討論一下這兩種方式的優缺點要實現多任務&#xff0c;通常我們會設計Master-Worker模式&#xff0c;Master負責分配任務&#xf…

Filebeat占用內存和CPU過高問題排查

經反饋&#xff0c;新部署的服務器上filebeat占用的cpu過高&#xff0c;且內存只增不減。 而據我了解filebeat非常輕量級&#xff0c;正常情況下占用的資源幾乎都能忽略不計&#xff0c;所以懷疑是filebeat本身出了問題。 第一時間查看filebeat日志&#xff08;默認路徑/var/lo…

Teams架構剖析(2019年版本)

在上個月剛剛結束的Ignite大會上&#xff0c;Teams產品的架構師Bill Bliss給大家奉上了最新的Teams的架構設計&#xff0c;之前2017年和2018年微軟的技術大會上都Teams架構的分享&#xff0c;但是今年大神把Teams架構講得很深入&#xff0c;覆蓋面很廣。我這里就挑一些&#xf…

pycharm工具下代碼下面顯示波浪線的去處方法

近期安裝了python后&#xff0c;發現使用pycharm工具打開代碼后發現代碼下邊會有波浪線的顯示&#xff1b;但是該代碼語句確實沒有錯誤&#xff0c;通過查詢發現了兩種方法去掉該波紋的顯示&#xff0c;下面就具體說明一下&#xff1a; 方法一&#xff1a; 打開pycharm在右下方…

js面向對象與PHP面向對象總結

js面向對象&#xff1a; 1.什么是對象&#xff1f; 對象&#xff1a;任何實體都是對象&#xff0c;擁有屬性和方法兩大特征 屬性&#xff1a;描述事物的特點&#xff1b; 方法&#xff1a;實物擁有的行為&#xff1b; 2.在JS里 Person.name"zhang" Person.fnfunction…

面向全球用戶的Teams app之Culture數字篇

我前幾周在微軟Ignite the Tour北京大會上&#xff0c;分享了如何開發一款面向全世界用戶的Teams App&#xff0c;里面介紹了在開發Global Ready的app時會遇到的各種挑戰&#xff0c;反響很好。所以我準備寫幾篇文章&#xff0c;將這些內容分享給沒有時間參加大會的同學。 這篇…

Dubbo原理與框架設計

Dubbo是常用的開源服務治理型RPC框架&#xff0c;在之前osgi框架下不同bundle之間的方法調用時用到過。其工作原理和框架設計值得開源技術愛好者學習和研究。 一、Dubbo的工作原理 調用關系說明 服務容器負責啟動&#xff0c;加載&#xff0c;運行服務提供者。服務提供者在啟動…

面向全球用戶的Teams app之Culture計量單位和禁忌篇

我在前一篇文章里分享了Global Ready的app時會遇到的不同文化對于數字方面的挑戰。這篇我繼續分享不同文化對于計量單位和禁忌方面的挑戰。 我們先來看一個例子&#xff0c;假如有一個teams bot&#xff0c;它告訴你一些動物的速度&#xff0c;比如它告訴你&#xff1a; 獵豹能…

【我的Android進階之旅】Android自定義Lint實踐

背景 2017年8月份的時候&#xff0c;我在公司開始推廣Lint、FindBugs等靜態代碼檢測工具。然后發現系統自帶的Lint檢測的Issue不滿足我們團隊內部的特定需求&#xff0c;因此去自定義了部分Lint規則。這個檢測運行了大半年&#xff0c;運行良好&#xff0c;團隊的代碼規范也有了…

存儲結構與索引

一、SQL數據存儲的基本介紹 數據庫中的數據存儲涉及頁&#xff08;Page&#xff09;和區&#xff08;Extent)這兩個概念了。SQL server中數據存儲的基本單位是頁。為數據庫中的數據文件&#xff08;.mdf或.ndf&#xff09;分配的磁盤空間可以從邏輯上劃分成頁&#xff08;從0到…

面向全球用戶的Teams app之時區篇

我在前兩篇文章里分享了Global Ready的app時會遇到的不同文化的挑戰。這篇我繼續分享在時區方面的挑戰。 時間是最復雜的&#xff0c;最容易出錯的部分。時間復雜的最根本原因是時區問題。 首先&#xff0c;大家都知道&#xff0c;我們地球是圓的&#xff0c;這個意味著如果大…

Linux: Nginx proxy_pass域名解析引發的故障

背景 業務架構&#xff1a; 部署細節&#xff1a;  兩容器均部署在同一機器上&#xff0c;通過 docker-compose 編排&#xff0c;并且通過link方式鏈接。 故障描述 在有次更新代碼時&#xff0c;發現前端能夠打開&#xff0c;但是所有接口請求全是502(Bad GateWay) 故障排查 …

Oracle建立全文索引詳解

Oracle建立全文索引詳解1.全文檢索和普通檢索的區別 不使用Oracle text功能&#xff0c;當然也有很多方法可以在Oracle數據庫中搜索文本&#xff0c;比如INSTR函數和LIKE操作&#xff1a; SELECT *FROM mytext WHERE INSTR (thetext, Oracle) > 0; SELECT * FROM mytext WHE…

面向全球用戶的Teams app之夏令時篇

我在前兩篇文章里分享了Global Ready的teams app時會遇到的不同挑戰。這篇我繼續分享在夏令時方面的挑戰。 夏令時&#xff0c;主要是為了節約能源&#xff0c;英文里通常縮寫成DST(Daylight Saving Time)。一般在天亮早的夏季人為將時間調快一小時&#xff0c;可以使人早起早…

爬取全部的校園新聞

1.從新聞url獲取新聞詳情&#xff1a; 字典,anews 2.從列表頁的url獲取新聞url&#xff1a;列表append(字典) alist 3.生成所頁列表頁的url并獲取全部新聞 &#xff1a;列表extend(列表) allnews *每個同學爬學號尾數開始的10個列表頁 4.設置合理的爬取間隔 import time import…

面向全球用戶的Teams app之合規性篇

我在前兩篇文章里分享了Global Ready的app時會遇到的不同挑戰。這篇我繼續分享在合規性方面的挑戰。 說到合規性compliance&#xff0c;不得不說GDPR標準&#xff0c;當我們發布了一個teams app后&#xff0c;微軟會要求開發人員做一個security self assessment&#xff0c;這…

C進階 - 內存四驅模型

一.內存四驅模型 不知我們是否有讀過 《深入理解 java 虛擬機》這本書&#xff0c;強烈推薦讀一下。在 java 中我們將運行時數據&#xff0c;分為五個區域分別是&#xff1a;程序計數器&#xff0c;java 虛擬機棧&#xff0c;本地方法棧&#xff0c;java 堆&#xff0c;方法區。…

行內元素中去掉文字的上下間距,使得文字所在元素的高度同字體高度一致的方法...

之前在p這類塊元素中的文字&#xff0c;給line-hight1;就可以去掉文字自帶的上下間距&#xff0c; 像這樣&#xff1a; 最近突然發現這個方法在行內塊和塊元素上好使&#xff0c;可當用在span或者a這類內聯元素上都不好使&#xff0c;除了轉為塊元素的方法來去掉上下間距&#…

VSCode的Teams插件

隨著今年在線的Build大會的結束&#xff0c;又是一大波的 Teams 新功能&#xff0c;新工具&#xff0c;新SDK。我接下來幾篇博客就會詳細和大家一一介紹。我今天先從VSCode的插件開始。 打開VS Code&#xff0c;搜索Teams&#xff0c;就可以找到Microsoft Teams Toolkit插件&a…