二分查詢演算法java版實現(遞迴實現與非遞迴實現)
阿新 • • 發佈:2019-02-18
二分查詢,如果一個有序集合,需要查詢其他特定 的查詢,我們可以使用二分查詢,加快查詢速度,具體的思路就是,每次取有序陣列的中間元素與待查詢元素進行比較,從而縮小一半的查詢範圍。
java版本非遞迴方式實現二分查詢:
java版本遞迴方式實現二分查詢:/** * * @param source * @param search * @return 返回匹配的下標 */ public static final int twoPointSearch(int[] source, int search) { int min = 0; int max = source.length - 1; int mid = ( max - min ) >> 1 ; while (mid >= 0 && mid <= max && max >= min) { if(source[mid] == search ) { return mid; } if(source[mid] > search ) { // 在souce前半部分查詢 max = mid - 1; } else { // 在souce後半部分查詢 min = mid + 1; } mid = ((max-min) >> 1) + min ; } return -1; }
測試程式碼如下:/** * 二分查詢,遞迴版本 * @param source 有序陣列 * @param search 待查詢元素 * @param min 開始下標 * @param max 結束下標(初始值為有序陣列長度減1) * @return */ public static final int twoPointSearchByRecursion(int[] source, int search, int min, int max) { int mid = ((max-min) >> 1) + min ; if(mid >= 0 && mid <= max && max >= min ) { if(source[mid] == search ) { return mid; //返回下標 } if(source[mid] > search ) { // 在souce前半部分查詢 max = mid - 1; } else { // 在souce後半部分查詢 min = mid + 1; } return twoPointSearchByRecursion(source, search, min, max) ; } //否則結束遞迴 return -1; }
/** * 二分查詢 */ public static final void testTwoPointSearch() { int[] source = new int[] { 1,13,21,35,39,51,62,78,99 }; System.out.println(twoPointSearch(source, 22)); System.out.println(twoPointSearch(source, 21)); System.out.println(twoPointSearch(source, 1)); System.out.println(twoPointSearch(source, 99)); System.out.println(twoPointSearchByRecursion(source, 22, 0, source.length-1)); System.out.println(twoPointSearchByRecursion(source, 21, 0, source.length-1)); System.out.println(twoPointSearchByRecursion(source, 1, 0, source.length-1)); System.out.println(twoPointSearchByRecursion(source, 99, 0, source.length-1)); }