二次取中法的matlab实现

本文介绍了如何在MATLAB中实现二次取中法,用于将n*5的矩阵划分为两类。通过避免使用时间复杂度为nlogn的sortrows函数,转而采用二次取中算法找到中位数的中位数,并利用类似于快速排序的partition操作优化效率,确保算法的时间复杂度符合BFPRT算法的要求。
摘要由CSDN通过智能技术生成

二次取中法的matlab实现

将数组填充为n*5的矩阵,每行五个元素排序,二次取中后划为两类。
之后递归调用。

之前在找每行中位数的中位数时使用了matlab自带的sortrows函数,后来发现该函数使用了快排来实现,导致时间复杂度变为nlogn。这种方法不满足BFPRT算法的n级别的时间复杂度。

因此在这里更改为再通过二次取中算法找出中位数的中位数,之后使用类似于快速排序中的partition操作调整矩阵行序。

所以二次取中这个算法每次执行可能会出现两个递归分支。
代码:

function main()
k=22;
arr = [31,5,55,17,22,3,19,19,4,728,37,6,89,8,66,4,12,57,44,90,25,...
    13,47,66,10,18,11,23,25,99,120,62,4,204,333];
fprintf('排序:')
disp(sort(arr));
%tic
disp(twiceMiddle(arr,k));
%disp(toc);
end

function value = twiceMiddle(arr,k)
%不大于5个则直接计算第k小
if length(arr)<=5
    arr=sort(arr);
    value=arr(k);
    return;
end

%将数组填入 n*5的矩阵
S=reshape(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值