"二分法"-"折半法"-查詢演算法-之通俗易懂,圖文+程式碼詳解-java程式設計
阿新 • • 發佈:2019-01-08
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位置.
這就是今天給大家講的二分(折半)查詢演算法,希望能幫組大家快速的理解清楚.