旋转数组的最小数字(二分法查找)

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;

}

}

你可能感兴趣的:(旋转数组的最小数字(二分法查找))