public class Test6 { //二分查找 public static int findPos(int[] a,int key) { int start=0; int end=a.length-1; int temp=0; while(startend){ int mid=(start+end)/2; if(keya[mid]){ start=mid+1; temp=start; }else if(keya[mid]){ end=mid-1; temp=end; }else { return mid; } } return temp; } public static void main(String[] args) { int[]array={1,4,6,7,10,11,23,78}; System.out.println(findPos(array, 0)); }}
10年積累的網(wǎng)站制作、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有特克斯免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
public class BinarySearchDemo {
public static void main(String[] args) {
int[] a = new int[]{1,5,7,9,11,18,23,48,69};
int point = new BinarySearchDemo().binarySearch(a, 23);
if(point == -1)
System.out.println("在數(shù)組中未查找到數(shù)23");
else
System.out.println("數(shù)字23是數(shù)組中第 " + (point + 1) + " 位數(shù)");
}
/**
* 二分法查找一個(gè)整數(shù)在整型數(shù)組中的位置
*
* 算法思路:首先得到數(shù)組a的最小值和最大值的下標(biāo),分別是:low和high,接著求出值位于數(shù)組中間那個(gè)數(shù)的下標(biāo)middle
* 然后再將這個(gè)middle對應(yīng)的數(shù)組中的數(shù)和待查找的數(shù)num進(jìn)行比較,如果相等,則表示已查找到,如果num a[middle]
* 則說明num位于a[low]和a[middle]之間,于是將a[middle - 1]設(shè)為較大值,繼續(xù)求出此時(shí)對應(yīng)的a[middle],
* 再進(jìn)行比較,其他情況可依次類推。一直到low=high,如果此時(shí)還沒有在數(shù)組a中查找到,則說明該數(shù)組a中沒有值num,返回-1
*
* @param a 給定的整型數(shù)組
* @param num 待查找的數(shù) num
*
* @return 返回整數(shù)num在數(shù)組a中的位置下標(biāo),如果未查找到則返回-1
* */
public int binarySearch(int[] a,int num){
int low = 0;
int high = a.length - 1;
while(low = high){
int middle = (low + high) / 2;
if(num == a[middle])
return middle;
else if(num a[middle])
high = middle - 1;
else
low = middle + 1;
}
return -1;
}
}
程序基本上就是這樣了,其中注釋中有詳細(xì)的解釋說明
//你那程序太難改了,每個(gè)方法都單職責(zé)啊
public?class?Test6?{
//二分查找
public?static?int?findPos(int[]?a,int?key)?{
int?start=0;
int?end=a.length-1;
int?temp=0;
while(startend){
int?mid=(start+end)/2;
if(keya[mid]){
start=mid+1;
temp=start;
}else?if(keya[mid]){
end=mid-1;
temp=end;
}else?{
return?mid;
}
}
return?temp;
}
public?static?void?main(String[]?args)?{
int[]array={1,4,6,7,10,11,23,78};
System.out.println(findPos(array,?0));
}
}
我大概看了一下,找出了你2個(gè)重要的缺點(diǎn).
第一,你用一個(gè)5個(gè)數(shù)的小數(shù)組挨個(gè)按你寫的算法算一下,你會發(fā)現(xiàn)很多地方是a.length-1而非a.length,有的地方是==,而不是.
其中還有2個(gè)小地方.
if(counta.length/2) break;
可以寫成while(reader.hasNextInt()counta.length/2).
3.else if(na[middle]) 可以寫成 else.
第二,是最重要的問題.算法上面.
試想一下如果只有2個(gè)數(shù).start是0,end是1,給出的數(shù)是a,用你的if(na[middle]) start=middle;0.5取0,永遠(yuǎn)start,middle都是0.如果你說因此你用a.length而不是減1,那a就永遠(yuǎn)也取不到。
怎么解決,加一個(gè)如果middle=(start+end)/2后等于start且不為0的話,start取end.
本文標(biāo)題:包含二分查找java代碼6的詞條
標(biāo)題鏈接:http://aaarwkj.com/article30/docpeso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、云服務(wù)器、網(wǎng)站改版、網(wǎng)站制作、用戶體驗(yàn)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)