日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 芯聞號(hào) > 充電吧
[導(dǎo)讀]二分查找又稱折半查找,優(yōu)點(diǎn)是比較次數(shù)少,查找速度快,平均性能好;其缺點(diǎn)是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用于不經(jīng)常變動(dòng)而查找頻繁的有序列表。首先,假設(shè)表中元素是按升序排列,將表

二分查找又稱折半查找,優(yōu)點(diǎn)是比較次數(shù)少,查找速度快,平均性能好;其缺點(diǎn)是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用于不經(jīng)常變動(dòng)而查找頻繁的有序列表。首先,假設(shè)表中元素是按升序排列,將表中間位置記錄的關(guān)鍵字與查找關(guān)鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個(gè)子表,如果中間位置記錄的關(guān)鍵字大于查找關(guān)鍵字,則進(jìn)一步查找前一子表,否則進(jìn)一步查找后一子表。重復(fù)以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時(shí)查找不成功。

前提:數(shù)組必須是有序的。

算法時(shí)間復(fù)雜度:O(log(n))

二分查找法也稱為折半查找法,它充分利用了元素間的次序關(guān)系,采用分治策略,可在最壞的情況下用O(log n)完成搜索任務(wù)。它的基本思想是,將n個(gè)元素分成個(gè)數(shù)大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,算法終止。如 果x

總之,二分查找算法的思想就跟二叉樹的查找一樣,如果大于就在右邊找,小于就在左邊找,等于就表示找到了。這里的結(jié)果我使用的是返回?cái)?shù)組的下標(biāo),如果沒有找到則返回-1。代碼如下:

1.遞歸法二分查找


//?遞歸二分查找
	public?static?int?binarySearch(Integer?array[],?int?key,?int?left,?int?right)?{
		int?center?=?left?+?(right?-?left)?/?2;?//?防止用(left+right)/2時(shí)left+high溢出
		if?(array[center]?==?key)?{
			System.out.println("找到了");
			return?center;
		}?else?if?(array[center]?<?key)?{
			return?binarySearch(array,?key,?center?+?1,?right);
		}?else?if?(array[center]?>?key)?{
			return?binarySearch(array,?key,?left,?center?-?1);
		}
		return?-1;
	}


2.非遞歸二分查找


//?非遞歸二分查找
	public?static?int?binarySearch1(Integer?array[],?int?key)?{
		int?left?=?0,?right?=?array.length-1;
		int?mid?=?-1;
		while?(left?>?1);
			if?(key?==?array[mid])?{
				return?mid;
			}?else?if?(key?<?array[mid])?{
				right?=?mid-1;
			}?else?{
				left?=?mid?+?1;
			}
		}
		return?-1;
	}


測(cè)試


	public?static?void?main(String[]?args)?{
		Integer?array[]?=?{?1,?2,?3,?4,?5,?6,?7,?8,?9,?10?};
//		System.out.println(binarySearch(array,?2,?0,?array.length));
		System.out.println(binarySearch1(array,?5));
	}


結(jié)果:4

表示找到了元素5,并在下標(biāo)為4的地方。


附:C++代碼


int?binarySearch(vector&array,int?key){
????int?left?=?0,right?=?array.size()-1;
????int?mid?=?-1;
????while?(left?>?1);??//得到的是向下取整,如0,9的為4
????????cout<<mid<<endl;
????????if?(key?==?array[mid])?{
????????????return?mid;
????????}?else?if?(key?<?array[mid])?{
????????????right?=?mid-1;
????????}?else?{
????????????left?=?mid+1;
????????}
????}
????return?-1;
}
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉