1. 程式人生 > >"二分法"-"折半法"-查詢演算法-之通俗易懂,圖文+程式碼詳解-java程式設計

"二分法"-"折半法"-查詢演算法-之通俗易懂,圖文+程式碼詳解-java程式設計

1.特點及概念介紹

    下面給大家講解一下"二分法查詢"這個java基礎查詢演算法,那麼什麼是二分法呢?其實所謂的"二分法",就是一分為二的意思,綜合起來理解就是一分為二的查詢,但大家記住了,二分法是建立在"已經按順序排好"的基礎條件上,如果大家把這個二分法查詢理解清楚了,那麼會有助於你更好的理解快速排序,下面我就羅列出該演算法的特點:

    1.定義起始位置start(0角標),定義末位置end(lenght-1位置,即最後一位)
    2.無限迴圈的查詢一個值,先看看該值是不是在中間mid角標,mid=(star+end)/2
    3.如果該值大於mid角標對應值,那麼start變成mid的右邊一位,如果小於,那麼end就變成mid的左邊一位,這樣會極其的高效.
    5.找到值就返回值或列印,找不著也返回-1或列印,並停止迴圈.

2.圖文描述過程

這裡寫圖片描述

現有需求:

1.有一個已經排列好順序的從小到大的陣列.
2.請查詢一個數字所在的角標位置.
3.如果元素不存在,請給出如果插入,那麼應該插入的位置.

3.程式碼詳情

public class Demo04 {
    public static void main(String[] args) {
        int[] ints = { 1, 3, 5, 7, 9, 11, 14 };
        find(ints, 3);
        find(ints, 14);
        find(ints, 6);
    }
    /**
     * 如果找不到,那麼求應該插入的位置
     */
private static void find(int[] ints, int i) { // int index = Arrays.binarySearch(ints, i); // System.out.println(index);//找不到返回負數 int start = 0; int end = ints.length - 1; while (true) { int mid = (start + end) / 2; // 注意中間是兩者之和的一半 if (i == ints[mid]) { System.out.println("index = "
+ mid);// 正好找到列印角標,停止; break; } else { if (i < ints[mid]) {// 小於中間值,那麼end變成中間往中間往左一位 end = mid - 1; } else {// 大於則相反 start = mid + 1; } } // 交叉了-即找不到情況,說明start在0或者尾部或者在交叉時的前一位,那麼得到應該插入位置; if (start > end) { // 找到了前面一個start,並確定在此即可; System.out.println("no find, will insert in :" + start); break; } } }

輸出結果(分別找3,找14,找6)

index = 1
index = 6
no find, will insert in :3

4.總結:

二分法查詢,又稱折半查詢,大家需要記住的重點有

1.已經排序好的陣列
2.確定最左邊的start,最右邊的end
3.無限迴圈當中找mid角標對應的值,start和end會根據情況改變
4.當發現start和end交叉,那麼證明找不到,即如果放入該元素,那麼就應該放在此時的start位置.

這就是今天給大家講的二分(折半)查詢演算法,希望能幫組大家快速的理解清楚.