二分查詢的思想是在已經排序(公升序)的陣列中,如果要查詢的數比中位數小,那麼其位置只可能在左半部分,相反只能在右半部分。這樣每次把查詢區間縮小一半,比順序查詢效率快得多。
非遞迴寫法:
public static int binarysearchinasclooply(int nums,int start,int end,int t)else if(nums[mid]>t)else
} return found;
}
傳入start和end索引而不是在函式內部固定死為0和nums.length-1是為了提高函式復用性。
遞迴寫法:
public static int binarysearchinascrecursively(int nums,int start,int end,int t)else if(nums[mid]>t)else
return found;
}
有時候我們可能需要查詢公升序陣列中第乙個比目標值大的位置(例如二分插入排序),比較中位數與目標值,存在兩種情況:
1、中位數比目標值大,但是中位數不一定是第乙個比它大,如果前乙個數比它小,則當前中位數就是乙個比目標值大的位置,否則要繼續向前查詢。
2、中位數比目標值小或者相等,需要繼續往後找。
public static int binarysearchfirstbiggerinasc(int nums,int start,int end,int t)else
} return end+1;
}
這裡如果陣列中沒有比查詢值大的,返回end+1,表明第乙個比目標值大的位置至少是end+1。
資料結構與演算法,二分查詢
1.時間複雜度 每次能去掉一半即 logn 2.實現方式 while迴圈 與 遞迴 我更推薦 while 迴圈,因為遞迴有個潛在的問題就是 stack over flow 堆疊溢位 而且在實際工程中是盡量避免遞迴的。雖然遞迴寫起來方便,也不容易出錯。3.實現關鍵點 我總結了下,一共有以下四點 sta...
資料結構與演算法 二分查詢
基礎概念 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用陣列作為表的儲存結構。不妨設有序表是遞增有序的。通俗理解 每次首先找到陣列的中間位置 middle 然後把待查詢數 target 與middle進行比較。如果查詢數target ...
資料結構與演算法 二分查詢
以浙大mooc題目為背景進行非遞迴實現。list結構定義如下 typedef int position typedef struct lnode list struct lnode l是使用者傳入的乙個線性表,其中elementtype元素可以通過 進行比較,並且題目保證傳入的資料是遞增有序的。函式...