二分查找、upper_bound、lower_bound
生活随笔
收集整理的這篇文章主要介紹了
二分查找、upper_bound、lower_bound
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
整理及總結(jié)二分查找的判斷和邊界細(xì)節(jié)
修改版
package com.leej.binarysearch;import java.util.Arrays;/*** @author jerry* @create 17/10/7 12:21*/ public class BinarySearch {public static int BinarySearch(int[] nums, int key) {int start = 0, end = nums.length - 1;int mid;while(start <= end) {mid = (start + end) >> 1;if (nums[mid] == key) return mid;else if (nums[mid] > key)end = mid -1;elsestart = mid + 1;}return -(start + 1);}public static int LowerBound(int[] nums, int key) {int first = 0, last = nums.length;int mid;while(first < last) {mid = (first + last) >> 1;if (nums[mid] < key) {first = mid + 1;} else {last = mid;}}return first;}public static int UpperBound(int[] nums, int key) {int first = 0, last = nums.length;int mid;while(first < last) {mid = (first + last) >> 1;if (nums[mid] <= key) {first = mid + 1;} else {last = mid;}}return first;}public static void showArrays(int[] nums) {for(int num : nums) System.out.print(num + " ");System.out.println();}public static void main(String[] args) {int[] nums = {10,20,30,30,20,10,10,20, 10};Arrays.sort(nums); //10 10 10 20 20 20 30 30showArrays(nums);//System.out.println( BinarySearch(nums, 11) );System.out.println(LowerBound(nums, 21));System.out.println(UpperBound(nums, 21));} }實(shí)現(xiàn)
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Arrays; import java.lang.String; /*** @author jerry* @create */ public class test {public static void showArray(int[] nums) {if (nums == null || nums.length == 0) return;for (int nu : nums) System.out.printf("%d ", nu);System.out.println();}/*** 循環(huán)條件left<=right, 所以left != mid , right != mid;* 雙閉區(qū)間[left, right]**/public static int binarySearch(int[] nums, int target) {int left = 0, right = nums.length - 1, mid; //search range [left, right],閉區(qū)間while(left <= right) {mid = (left + right) >> 1;if (nums[mid] == target)return mid;else if (nums[mid] < target)left = mid + 1;elseright = mid - 1;}return -1;}/****STL 版本lower_bound* 找到第一個(gè)大于等于target的數(shù), in range [first, last), 左開右閉區(qū)間**/public static int lower_bound(int[] nums, int target) {int first = 0, last = nums.length;int mid, len, step;len = last - first;while(len > 0) {step = len >> 1;mid = first + step;if (nums[mid] < target) { //[mid + 1, last)first = mid + 1;len -= step + 1;} else { //[first, mid)最后可取邊界midlen = step;}}return first;}//找到第一個(gè)大于等于targetpublic static int my_lower_bound(int[] nums, int target) {int first = 0, last = nums.length, mid;//in ranget [first, last)while(first < last) {mid = (first + last) >> 1;if (nums[mid] < target) { //[mid+1, last)first = mid + 1;} else {last = mid;}}return first;}//找到第一個(gè)大于target的數(shù)public static int my_upper_bound(int[] nums, int target) {int first = 0, last = nums.length, mid;//in range [first, last)while(first < last) {mid = (first + last) >> 1;if (nums[mid] <= target) { first = mid + 1;} else {last = mid;}}return first;}public static void main( String args[] ){int[] nums = {10,20,30,30,20,10,10,20, 10};Arrays.sort(nums); //10 10 10 20 20 20 30 30test.showArray(nums);System.out.println( test.binarySearch(nums, 11) );System.out.println( test.my_lower_bound(nums, 20) );System.out.println( test.lower_bound(nums, 20) );System.out.println( test.my_upper_bound(nums, 20) );} }//#output // 10 10 10 10 20 20 20 30 30 // -1 // 4 // 4 // 7References
轉(zhuǎn)載于:https://www.cnblogs.com/johnleo/p/binary_search.html
總結(jié)
以上是生活随笔為你收集整理的二分查找、upper_bound、lower_bound的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 裸辞后五险一金怎么办 可以用这两种方式处
- 下一篇: NoSQL简单介绍