二分法桶雀,顧名思義矿酵,就是對(duì)半劃分,那怎么進(jìn)行對(duì)半劃分呢矗积?
二分法的基本思路坏瘩,首先初始化左右兩個(gè)指針,分別指向數(shù)組的第一個(gè)元素和最后一個(gè)元素漠魏,然后在每次迭代中計(jì)算中間位置mid,并將目標(biāo)元素與中間元素進(jìn)行比較妄均。如果中間元素等于目標(biāo)元素柱锹,則直接返回中間位置mid;如果中間元素小于目標(biāo)元素丰包,則在右半部分繼續(xù)查找禁熏;如果中間元素大于目標(biāo)元素,則在左半部分繼續(xù)查找邑彪。重復(fù)以上步驟瞧毙,直到找到目標(biāo)元素或左右指針重合。
選取一個(gè)二分法的使用場景寄症,在一個(gè)有序的列表中找到一個(gè)目標(biāo)數(shù)宙彪,返回目標(biāo)元素在數(shù)組中的索引,如果目標(biāo)元素不存在于數(shù)組中有巧,則返回-1释漆。
定義一個(gè)類型為 Integer 類型的數(shù)組 , 在本次我們要尋找的目標(biāo)值 target = 8
int[] nums = new int[]{1, 2, 4, 6, 8, 10};
在這個(gè)數(shù)組中篮迎,left 和 right 分別為左右邊界
public static int getTarget(int[] nums, int target) {
// 左邊界
int left = 0;
//右邊界
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
//如果中間元素小于目標(biāo)元素男图,則在右半部分繼續(xù)查找
if (target > nums[mid]) {
left = mid + 1;
} //如果中間元素大于目標(biāo)元素,則在左半部分繼續(xù)查找
else if (target < nums[mid]) {
right = mid - 1;
} else {
return mid;
}
}
return -1;
}
程序輸出元素所在位置
其實(shí)中間位置的選擇是有講究的甜橱,有人會(huì)問逊笆,為啥不是 (left + right)/2 呢∑癜粒可以試一試难裆,如果使用 (left + right)/2和(right - left)/2 會(huì)在程序中陷入死循環(huán)
畫圖解釋 mid
所以mid的值一定要在新的left邊界加上中間的值,即 int mid = left + (right - left) / 2