- 基本的二分法是通过,左右两端不断折半实现查找的算法;这里我使用一个已知在数组中的数据,去查找它在有序数组中的位置;
- 上代码
public static void main(String[] arg0){
int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30};
int start = 0;
int middle = (array.length+1)/2;
int end = array.length -1;
int question = 23;
int pos = -1;
while (start < end){
System.out.println("start= "+start+", end="+end);
if (question < array[start] || question > array[end]){
pos = -1;
break;
} else if (question == array[start]){
pos = start;
break;
} else if (question == array[middle]){
pos = middle;
break;
} else if (question == array[end]){
pos = end;
break;
} else if (question > array[start] && question < array[middle]){
//如果数据在左半边
start = start;
middle = (start + middle + 1) /2;
end = middle;
} else if (question > array[middle] && question < array[end]){
//如果数据在右半边
start = middle;
middle = (end + middle + 1) /2;
end = end;
}
}
System.out.println("result = "+pos);
}
上结果
start= 0, end=30
start= 16, end=30
result = 23
结论
- 二分法的时间复杂度为
O(log2N)
- 关键思想是:假设该数组的长度是N,那么二分后是N/2,再二分后是N/4…直到二分到1结束(当然这是属于最坏的情况了,即每次找到的那个中点数都不是我们要找的那个数字)