1. 二分查找
在對線性表的操作中,經(jīng)常需要查找某一個元素在線性表中的位置惫确。此問題的輸入是待查元素x和線性表L,輸出為x在L中的位置或者x不在L中的信息。
算法介紹:
二分查找又稱折半查找固蛾,優(yōu)點是比較次數(shù)少,查找速度快度陆,平均性能好艾凯;其缺點是要求待查表為有序表,且插入刪除困難懂傀。因此趾诗,折半查找方法適用于不經(jīng)常變動而查找頻繁的有序列表。首先蹬蚁,假設(shè)表中元素是按升序排列恃泪,將表中間位置記錄的關(guān)鍵字與查找關(guān)鍵字比較郑兴,如果兩者相等,則查找成功贝乎;否則利用中間位置記錄將表分成前杈笔、后兩個子表,如果中間位置記錄的關(guān)鍵字大于查找關(guān)鍵字糕非,則進一步查找前一子表蒙具,否則進一步查找后一子表。重復(fù)以上過程朽肥,直到找到滿足條件的記錄禁筏,使查找成功,或直到子表不存在為止衡招,此時查找不成功篱昔。采用的是分治法。
時間復(fù)雜度分析:
時間復(fù)雜度無非就是while循環(huán)的次數(shù)始腾!
總共有n個元素州刽,
漸漸跟下去就是n,n/2,n/4,….n/2^k(接下來操作元素的剩余個數(shù)),其中k就是循環(huán)的次數(shù)
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2為底浪箭,n的對數(shù))
所以時間復(fù)雜度可以表示O()=O(log2 n)
public class HalfSearch {
private static ArrayList list=new ArrayList(); //創(chuàng)建數(shù)組隊列
public static void main(String[] args) { //主方法
for(int i=0;i<4;i++)
{ Scanner Sca =new Scanner(System.in);
int str=Sca.nextInt();
int a=Sca.nextInt();
list.add(a);
}
System.out.println("請輸入要查找的數(shù):");
Scanner Sc =new Scanner(System.in); //輸入數(shù)組隊列
int b=Sc.nextInt();
HalfSearch hf=new HalfSearch();
hf. halfSearch(b,list); //二分查找
}
public void halfSearch (int b,ArrayList list){
int length=list.size();
int l=0;
int m=(length+l)/2;
while(l<=length){
//b=(int) (list.get(m));
if(b<((int)list.get(m))){ //小于中間數(shù)
length=length/2;
length=m-1;
}else if (b>(int)list.get(m)){ //大于中間數(shù)
l=m+1;
}
else if(b==(int)list.get(m)){ //等于中間數(shù)穗椅,輸出
System.out.println("數(shù)已經(jīng)找到,位置是:"+m);
}
}
}
}