二次取中法的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(