二分查詢 C/C++實現
Jon Bentley:90%以上的程式設計師無法正確無誤的寫出二分查詢程式碼。
如果你不信,你可以先嚐試著寫一下當時看到這裡的時候我試著寫了一下,結果忘了考慮middle的溢位問題
好了,接下來仔細看看吧,一定會有你犯下的錯誤:
注意:二分查詢是針對排好序的陣列
二分查詢可以解決“預排序陣列的查詢”問題:只要陣列中包含T(即要查詢的值),那麼通過不斷縮小包含T的範圍,最終就可以找到它。一開始,範圍覆蓋整個陣列。將陣列的中間項與T進行比較,可以排除一半元素,範圍縮小一半。就這樣反覆比較,反覆縮小範圍,最終就會在陣列中找到T,或者確定原以為T所在的範圍實際為空。對於包含N個元素的表,整個查詢過程大約要經過log
//二分查詢 //array 陣列,n 陣列長度,value 想要找的值 int binary_search(int array[],int n,int value) { int left=0; int right=n-1; while(left<=right) { //int middle=(left+right)/2;//n為偶數,取靠左的那個(當left和right比較大時,二者之和可能會溢位) int middle=left + ((right-left)>>1); //防止溢位,移位也更高效。同時,每次迴圈都需要更新。 if(array[middle]>value) { right=middle-1; } else if(array[middle]<value) { left=middle+1; } else { return middle; } } return -1; }
在編寫程式時有以下幾個要點:
1、right=n-1 => while(left <= right) => right=middle-1;
right=n => while(left < right) => right=middle;
2、middle的計算不能寫在while迴圈外,否則無法得到更新。
3、int middle=left + ((right-left)>>1);
這樣寫是為了:防止溢位。移位也更高效。同時,每次迴圈都需要更新。
注意,如果你這樣寫:int middle=(left+right)/2;//n為偶數,取靠左的那個(我當初就是這麼寫的)
當left和right比較大時,二者之和可能會溢位!
相關推薦
二分查詢法(C++ 模板實現)
/*演算法總結 二分查詢法: 二分查詢法的前提是資料已經排序,時間平均複雜度為 O(lgn) 歡迎轉載,轉載請註明作者 [email protected] */ #include <iostream> #include <stdi
二分查詢 (C語言版 + 註釋 + 完整程式碼)
本題要求實現二分查詢演算法。 函式介面定義: Position BinarySearch( List L, ElementType X ); 其中List結構定義如下: typedef int Position; typedef struct LNode *List
二分查詢遞迴實現
二分查詢的遞迴實現 #include <stdio.h> #include <assert.h> int BinarySearchR(int* a,int n,int left,int right,int key) {
二分查詢(Java實現)
二分查詢又稱為折半查詢,要求線性表必須採用順序儲存結構,並且元素按關鍵字有序排列。 查詢過程:假設陣列中元素按升序排列,將陣列中間位置的值與待查值比較,如果相等則查詢成功;否則利用中間位置下標將陣列分成
hdu 3763 CD(二分查詢) Java實現
題意:求集合A和B中有幾個相同的元素,其中集合中元素已經按升序排好,集合的元素個數n<=1000000 分析:集合中的元素已經按升序排好,只要對B中每個元素在A中進行二分查詢就解
基於有序陣列的二分查詢--java程式碼實現
基於有序陣列的二分查詢–java程式碼實現 有序陣列的java程式碼實現,其中有序陣列可能是兩段子有序陣列,如{7,9,2,4,5}: 程式碼塊 public class FindArrayIndexWithTarget { public
(旋轉陣列問題)給定一個整數型別的迴圈有序陣列,求迴圈陣列的特定值,使用二分查詢法(JAVA實現)
問題:請實現以下函式int indexOf(int [] array ,int key) ,給定一個迴圈有序的陣列,請在這個陣列中找到指定元素,找到的話返回下標,沒找到返回-1。: 解決:首先,使用二分查詢找到陣列的 “臨界點”,臨界點滿足兩個情況:
二分查詢法的實現和應用匯總
到目前位置,似乎我們學到的演算法中,時間複雜度是O(log n),好像就數二分查詢法,其他的諸如排序演算法都是 O(n log n)或者O(n2)。但是也正是因為有二分的 O(log n), 才讓很多 O(n2)縮減到只要O(n log n)。 關於二分查詢法 二分查詢法主要是解
演算法(第4版) 學習筆記二——二分查詢的普通實現與遞迴實現
以查詢某個特定元素在已排序陣列中的索引為例,且此陣列為從小到大排序。 演算法思路: 1、取第一個索引和最後一個索引代表兩個遊標,一個lo,一個hi 2、取lo和hi的中間值,即為mid,如下圖所示
二分查詢java程式碼實現
public static void main(String[] args) { Integer[] arr = new Integer[]{12,15,20,36,45,66,72,81,90}; int des = 22; int search = bin
C語言經典演算法(九)——遞迴實現二分查詢的兩種方法
後繼續整理演算法並寫出自己的理解和備註。 C++實現的:遞迴實現二分查詢演算法 1、 遞迴實現二分查詢 <1> 題目描述:針對資料,進行二分查詢(要求:資料的排列有序) <2> 方法一:概念法 <3> 方法二:遞迴法 原始碼: 一、 遞迴實現
[日常練習] 8. 基於有序陣列指定元素的二分查詢C語言實現
問題描述: 採用折半(二分)查詢的方式,在整型有序陣列中查詢想要的數字,找到了返回下標,找不到返回-1。 問題分析及原始碼: 有序陣列它的關鍵就是陣列下標最小值及最大值,二分查詢就是針對有序陣列最為簡單的一種查詢方式。關鍵注意迴圈的建立及跳出條件,當左側left都以經大
c++實現二分查詢
簡要描述 二分查詢又稱折半查詢,對排好序的陣列,每次取這個數和陣列中間的數進行比較,複雜度是O(logn)如:設陣列為a[n],查詢的數x, 如果x==a[n/2],則返回n/2; 如果x
插入排序演算法+優化 (二分查詢優化有序部分)C語言實現
直接插入排序 插入排序思想 直接插入排序思想是將待排序的陣列看作兩個部分:有序部分和無序部分,排序過程就是不斷將無序部分的元素插入到有序部分合適的位置上,使有序部分元素不斷增加而無序部分資料不斷減少,直到陣列全部有序為止。 假設陣列A[0...
二分查詢演算法的C++和Python實現
二分查詢演算法是在有序陣列中用到的較為頻繁的一種演算法,在未接觸二分查詢演算法時,最通用的一種做法是,對陣列進行遍歷,跟每個元素進行比較,其時間為O(n).但二分查詢演算法則更優,因為其查詢時間為O(l
【二分查詢】用C語言實現一個有序陣列的二分查詢
什麼是二分查詢? 首先,二分查詢也叫折半查詢,它是對於一組有序(升序或降序)數列來說的,我們舉例子說明這個思想。 例如:猜數字遊戲 隨機給出1-100內的一個數字,請猜出這個數字 那我們不能隨機沒有規律的去猜,這時考慮二分查詢的思想 例如38 第一次
二分查詢 C/C++實現
Jon Bentley:90%以上的程式設計師無法正確無誤的寫出二分查詢程式碼。 如果你不信,你可以先嚐試著寫一下當時看到這裡的時候我試著寫了一下,結果忘了考慮middle的溢位問題 好了,接下來仔細
二分查詢遞迴和非遞迴實現(c語言實現)
#include<stdio.h>++ int seeqSearch(int a[],int n,int k){ int i=n-1; for(;i>=0;i--){//遍歷陣列 if(a[i]==k){//找到對應的陣列
二分查詢演算法(C++實現)
#include <iostream> using namespace std; //在一個遞增陣列中,二分查詢值相等的任意一個數字,返回下標位置 int SearchEqualValue(int* arr,int len,int value) { if(a
C語言:遞迴和非遞迴實現二分查詢
二分查詢是將有序數列不斷地縮小,直到找到改元素或折半區域的首元素位置高於尾元素位置為止。//遞迴寫二分查詢 int BinarySearchD(int arr[], int x, int begin,