有序表查找---折半查找算法


折半查找概念

折半查找,又稱二分查找。
前提是線性表中的記錄必須是關鍵碼有序(由小到大或由大到小),線性表必須采用順序存儲。
折半查找的基本思想是:在有序表中,取中間值為比較對象,如果給定的值和中間值的關鍵字相等,則查找成功;若給定值小於中間記錄的關鍵字,則在中間記錄的左半區繼續查找;若給定的值大於中間值的關鍵字,則在中間記錄的右半區繼續查找。重復上述過程,直到查找成功,或查找所有區域無記錄,返回查找失敗。

算法實現

	public int Binary_Search(int[] a, int n, int key) {
		int low = 1, high = n, mid;
		while(low <= high) {
			mid = (int)((low + high) / 2);
			if(key < a[mid]) {
				high = mid - 1;
			}
			else if(key > a[mid]) {
				low = mid + 1;
			}
			else return mid;
		}
		
		return 0;
	}

通常會使用三個指針low,high,mid。分別表示查找區域的最左值下標,查找區域的最右值下標,已經當前比對值下標。

時間復雜度分析

折半查找其實等於是把靜態有序查找表分成了兩棵子樹,即查找經過只需要找其中的一半數據即可,等於工作量少了一半,以提升效率。
完全二叉樹存在定義:

具有n個節點的我拿權二叉樹深度為log2n + 1

盡管折半查找判定二叉樹並不是完全二叉樹,但同樣相同的推倒可以得到關鍵字或查找失敗的次數是log2n + 1。最好為情況下查詢次數為1。所有折半查找算法的時間復雜度為O(logn + 1)。

缺點

折半查找的前提是需要有序表順序存儲,對於靜態查找表,一次排序后不再變化,但對於需要頻繁執行插入或刪除操作的數據集來說,維護有序的排序會帶來不小的工作量,這個時候不建議使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM