1.二分法查找。
思想:假設數據是按升序排序的,對于給定值 x,從序列的中間位置開始比較,如果當前位置值等于 x,則查找成功;若 x 小于當前位置值,則在數列的前半段中查找;若 x 大于當前位置值則在數列的后半段中繼續查找,直到找到為止。
時間復雜度:遞歸O(log2n) ? 非遞歸O(log2n)
空間復雜度:遞歸O(log2n) ? 非遞歸O(1)
要求:必須是有序的序列,不重復。
代碼實現(java)
/** 二分法查找算法實現(非遞歸)
* 找到返回目標數字
* 未找到則返回-1
* Created by Darker on 15/7/17.
*/
public class TestA{
public static void ?main(String[]args){
inta[]={1,2,3,4,5,6};
System.out.println(findData(a,4));
}
public static int findData(int[]a,intx){
int start=0;
int end=a.length-1;
while(start<=end){
int middle=(start+end)/2;
if(x==a[middle]){
return a[middle];
}else
{
if(x
end=middle-1;
}else{
start=middle+1;
}
}
}
return-1;
}
}
2.接下來我們在繼續回到旋轉數組中最小值這個問題上面。什么是旋轉數組?書上的解釋是這樣的,將一個數組中的前面若干個元素,搬到數組的末尾,就是旋轉數組。直接上代碼看個明白。
public class TestA{
public static void main(String[]args){
inta[]={1,0,1,1,1,1};
System.out.println(findMinValue(a));
}/**
* 什么是旋轉數組,例如數組{3,4,5,1,2} 旋轉后變成{1,2,3,4,5}就是一個旋轉。
*
* */
public static int findMinValue(inta[]){
if(a.length!=0){
int start=0;
intend=a.length-1;
int middle=start;
while(a[start]<=a[end]){
if(end-start==1){
middle=end;
break;
}
middle=(start+end)/2;
if(a[start]==a[end]&&a[middle]==a[start])
return minInOrder(a,start,end);
if(a[middle]>=a[start]){
start=middle;
}else if(a[middle]<=a[end]){
end=middle;
}
}
return a[middle];
}else{
return-1;
}
}
/**
* 順序查找
* */
public static int minInOrder(int a[],int start,int end){
int result=a[start];
for(inti=start+1;i<=end;i++){
if(result<=a[i])
result=a[i];
}
return result;
}
}