已经从学校毕业一年,然而重温一下当年老师布置的各种算法作业,如今才刚刚领悟。因为是数学专业,所以就用MATLAB软件写了一番,也许还存在一些不足,但内心也有一丝的小成绩。今天,就写写二分查找法及其变形吧!
1. 二分查找法
1)非递归实现(源码)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
% 二分查找法 非递归实现
% 输入一个数组和要查找的数据,返回给定数据的位置
function BinarySearch_1()
% 定义函数BinarySearch_1,返回插值数据位置 mid
array=input('Please input an ordered array: '); %测试数组 [1 3 4 6 8 10 13 21 23 46 54 56]
value=input('Please input the number which you want to search: '); %输入要查找的值
n=length(array); % 计算数组的长度
low=1;
high=n;
%%%%%%%%%%%%%% 查 找 过 程 %%%%%%%%%%%%%
while low<=high
mid=floor((low+high)/2); %计算中间位置,若数据量为偶数,取中间左边位置
%若查到最后一个数据不等于value,则该数组不存在次数据,结束执行
if low==high && array(low)~=value
fprintf('Sorry, the number does not exist !!\n')
break;
else
if array(mid)==value %若中间位置数值等于value,直接返回
mid
break;
end
%若中间位置数值小于value,则value在中间数的右边(右区间),则将最左边坐标加一,继续从右区间查找
if array(mid)<value
low=mid+1;
%若中间位置数值大于value,则value在中间数的左边(左区间),则将最右边坐标减一,继续从左区间查找
else
high=mid-1;
end
end
end
end
------------------------------------------------------------------------------------------------------------------------------------------
2)递归实现(源码)
------------------------------------------------------------------------------------------------------------------------------------------
% 二分查找法 递归实现
% 输入一个数组和要查找的数据,返回该数据的位置
function BinarySearch_2(array,low,high,value)
% 定义函数bserch,参数array是一个数组
%测试数组 BinarySearch_2([1 3 4 6 8 10 13 21 23 46 54 56],1,12,21) 第8位
n=length(array); % 计算数组的长度
%%%%%%%%%%%%%%%%%%%% 查 找 过 程 %%%%%%%
if low>high
fprintf('Sorry, the number does not exist !!! \n\n')
else
mid=floor((low+high)/2);
if array(mid)==value
%mid
return
end
if array(mid)<value
BinarySearch_2(array,mid+1,high,value);
else
BinarySearch_2(array,mid-1,high,value);
end
end
end
----------------------------------------------------------------------------------------------------------------------------------------------------
1. 二分查找法的四种变形
1)变形一(源码)
% 二分查找法 变形一: 输入一个数组和要查找的数据,找到该数据第一次出现的位置
function bearch_change01(array,value) %测试数组 [1 3 4 8 8 8 13 16 16 25 28 32],8
% 定义函数bearch_change01
%参数array是一个数组,value为查找值,输出该值出现的第一个位置 mid
n=length(array); % 计算数组的长度
low=1;
high=n;
若中间值大于value,value在中间数左边,查找左区间
if array(mid)>value
high=mid-1;
%若中间值小value,value在中间数右边,查找右区间
elseif array(mid)<value
low=mid+1;
else
% 中间值=value,判断value是否第一次出现,否则继续查找
% 若中间数是数组第一个数据或者中间数的上一位不等于该值,则输出该位置,跳出循环,否则取左区间继续查找
if mid==1 || array(mid-1)~=value
mid
break;
else
high=mid-1;
end
end
end
end
--------------------------------------------------------------------------------------------------------------------------------------------------------------
对于上面的几种编辑就把原文件上传吧(见上传资源),这样感觉实在是太多太啰嗦。。。。。。。。。。。。。。。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
今天实在是被项目的代码搞得头懵懵,所以就拿算法来解解忧,嗯,心情瞬间美丽啦。。。孟姑娘,还需努力呀