演算法 二分查詢(折半查詢)

2021-09-24 23:00:12 字數 2837 閱讀 6627

一.二分查詢基本思想

在有序的序列裡,先將目標和中間的數值比較,如果大於中間數值,則在後半段的中間繼續比對;如果小於中間數值,則在前半段的中間繼續比對。以此類推,直至找到目標,或者結束查詢沒有找到。

二.關鍵條件

(1)有序序列

(2)順序儲存結構

三.時間複雜度

o(logn)

四.優點和不足

優點是比較次數少,查詢速度快,平均效能好;

缺點是要求待查表為有序表,且插入刪除困難

五.**示例:(下面例子皆以公升序為例)

1.最基本的二分查詢:

int binarysearch(int arr,int arr_l,int n)

else if(n這裡有幾個問題需要注意:

1.迴圈判定的條件:min<=max(如果直接是min2.為了防止資料溢位:mid=min+(max-min)/2

3.當n!=arr[mid]時,min=mid+1,max=mid-1

2.遞迴實現二分查詢

//遞迴二分查詢

int binarysearch2(int arr,int high,int low,int n)

if(n==arr[mid])

else if(n>arr[mid])

else

}

需要注意的問題同上。

3.二分法的幾種變形

(1)查詢目標值區域的左邊界(查詢與目標值相等的第乙個位置)(查詢第乙個不小於目標值數的位置)

//查詢目標值區域的左邊界(查詢與目標值相等的第乙個位置)(查詢第乙個不小於目標值數的位置)

int binarysearch(int arr,int arr_l,int n)

else

}if(min(2)查詢目標值區域的右邊界(查詢與目標值相等的最後乙個位置)(查詢最後乙個不大於目標值數的位置)

//查詢目標值區域的右邊界(查詢與目標值相等的最後乙個位置)(查詢最後乙個不大於目標值數的位置)

int binarysearch(int arr,int arr_l,int n)

else

}if(max>0&&arr[max]==n)

else

}

(3)查詢第乙個大於目標值的數/查詢比目標值大但是最接近目標值的數的位置(第二題變形)

int binarysearch(int arr,int arr_l,int n)

else

}return low注意此處就是大於目標值的最後一位,也就是max+1,也就是退出迴圈的 min

(4)查詢最後乙個小於目標值的數/查詢比目標值小但是最接近目標值的數的位置(第(1)題變形)

int binarysearch(int arr,int arr_l,int n)

else

}return max>0?max:-1;

}

(6).旋轉陣列(無重複項)

(什麼是旋轉陣列:將一組有序的序列左移,將移出來的部分依次連線到原序列後邊(1 2 3 4 5--------->4 5 1 2 3))

int findmin(int arr,int n)

while(leftarr[right])

else

}return arr[left];

}

和二分法的區別:(1)條件是right(2)如果arr[mid](7)旋轉陣列(有重複項)

int findmin(int arr,int n)

while(leftarr[right])

else if(arr[mid]區別就是當arr[mid]==arr[right]時,不知道最小值在右邊還是左邊,就讓right-1;

(8)旋轉序列中搜尋(不含重複項)

int search(int arr,int arr_l,int n)

while(leftarr[right])

else

}offset=left;

left=0,right=arr_l-1;

while(left<=right)

else if(n>arr[remid])

else

}return -1;

}

先找到最小的值,即找到分界點,然後根據remid=(mid+offset)%len求得真實的mid位置,即arr[remid]是有序序列的中點,arr[mid]為當前序列的中點(旋轉陣列),因此特別需要注意二分查詢時left=mid+1,而不是left=remid+1;

不需要找分界點的方法:

int search(int arr,int arr_l,int n)

while(left<=right)

else if(arr[left]<=arr[mid])//從這裡直接判斷

else

}else if(arr[mid]<=arr[right])

else

}} return -1;

}

(9)旋轉序列中搜尋(有重複項)

int search(int arr,int arr_l,int n)

while(left<=right)

else if(arr[mid]>arr[left])

else

}else if(arr[mid]arr[mid]&&n<=arr[right])

else

}else

}return -1;

}

待補充:二維陣列中的查詢

練習題目:

-ii/

二分查詢 折半查詢 演算法

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。首先,假設表中元素是按公升序排列,將表中間位置記錄的 關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置 記錄將表分成前 後兩個子...

演算法 二分查詢(折半查詢)

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。使用二分查詢的條件 1.必須採用順序儲存結構。2.必須按關鍵字大小有序排列。通俗一點的說 如果資料是乙個陣列,那麼這個陣列必須是有序的 時間複雜度 o log2n 如圖所示 下面我們來看c語言 include非遞迴實現 v...

折半查詢 二分查詢 演算法

順序查詢的優點是演算法簡單,表中對有序性無要求,但是查詢效率比較低。折半查詢跟普通的順序查詢的區別是 折半查詢要求表中的元素是有序的,並且是採用順序儲存的,不能是鏈式儲存的。折半查詢的主要思路是 在有序的表中,取得表中的中間記錄進行比較。如果給定查詢的值和中間記錄相等,就表示查詢成功 如果給定查詢的...