1. 程式人生 > >二分查詢 C/C++實現

二分查詢 C/C++實現

Jon Bentley:90%以上的程式設計師無法正確無誤的寫出二分查詢程式碼。

如果你不信,你可以先嚐試著寫一下微笑當時看到這裡的時候我試著寫了一下,結果忘了考慮middle的溢位問題難過

好了,接下來仔細看看吧,一定會有你犯下的錯誤:

注意:二分查詢是針對排好序的陣列

二分查詢可以解決預排序陣列的查詢問題:只要陣列中包含T(即要查詢的值),那麼通過不斷縮小包含T的範圍,最終就可以找到它。一開始,範圍覆蓋整個陣列。將陣列的中間項與T進行比較,可以排除一半元素,範圍縮小一半。就這樣反覆比較,反覆縮小範圍,最終就會在陣列中找到T,或者確定原以為T所在的範圍實際為空。對於包含N個元素的表,整個查詢過程大約要經過log

2N次比較。

//二分查詢
//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,