二分查找递归与非递归Java实现
程序员文章站
2022-03-14 20:52:32
...
二分法是算法里的一个重要方法,很多算法都可以用这个思想去解决,所以一定要掌握。
要使用它有一个前提条件:数组必须有序,递增或者递减;
二分查找的优点:比较次数较少、查找速度快、平均性能好;
二分查找的缺点:待查表为有序表,插入困难;由此延伸为顺序结构中,插入与删除比较困难;
二分查找的思想:
步骤一:首先确定整个查找区间的中间位置mid = (end - start)/2;
步骤二:用待查关键字值与中间位置的关键字值进行比较,若相等,则返回中间下标;
若不相等,有两种情况:
若array[mid] > key:查找范围缩小为左半区域,具体表现为:statrt不变,end = mid - 1;
若array[mid] < key:查找范围缩小为右半区域,具体表现为:end不变,start = mid + 1;
步骤三:对确定的缩小区域再进行折半公式,重复以上步骤!
注意的点:在使用if时一定要确定好是否还可以继续if的条件,那就是:start <= end,只有在这个条件底下,才可以查询!!!
递归实现:
public static int binarysearch(int[] nums,int num,int start,int end) {
if(nums.length==0 || start<0 || end>nums.length-1 || end<start) {
return -1;
}
while(end >= start) {
int mid = (start+end)/2;
if(nums[mid] == num) {
return mid;
}else if(nums[mid] > num) {
return binarysearch(nums, num, start, mid-1);
}else if(nums[mid] < num) {
return binarysearch(nums, num, mid+1, end);
}
}
return -1;
}
非递归实现
public static int binarysearch(int[] nums,int num) {
if(nums.length==0) return -1;
int start = 0;
int end = nums.length-1;
while(start <= end) {
//int mid = (end - start) /2 + start;
int mid = (start+end)/2;
if(nums[mid] == num) {
return mid;
}else if(nums[mid] < num) {
start = mid +1;
}else if(nums[mid] > num) {
end = mid-1;
}
}
return -1;
}
上一篇: js获取DOM元素的方式总结