二分查找法及其四种变形(MATLAB)

        已经从学校毕业一年,然而重温一下当年老师布置的各种算法作业,如今才刚刚领悟。因为是数学专业,所以就用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


--------------------------------------------------------------------------------------------------------------------------------------------------------------

对于上面的几种编辑就把原文件上传吧(见上传资源),这样感觉实在是太多太啰嗦。。。。。。。。。。。。。。。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

今天实在是被项目的代码搞得头懵懵,所以就拿算法来解解忧,嗯,心情瞬间美丽啦。。。孟姑娘,还需努力呀

 

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值