functionmain()
k=input('请输入k:');S=[3,6,5,7,2,3,19,19,1,2,1,67,89,90,100,7,65,67,600,55];fprintf('第%d小为:',k);
value=Select(S,k);fprintf('%d\n',value);return;
end
function value=Select(arr,k)
windowSize=5;%每windowSize个数分为一组
S1=(50);S2=(50);
n=length(arr);if n<=windowSize %不足windowSize,排序返回第K个
value=Sort(arr,k);return;
end
%把数组中的数放入二维数组,方便后面操作
M=zeros(windowSize,floor(n/windowSize));%m,m1,f,t;
m=1;for j=1:floor(n/windowSize)for i=1:windowSize
M(i,j)=arr(m);
m=m+1;
end
end
%每一列视为一组,对其从小到大进行排序
for j=1:floor(n/windowSize)%列数
for m=windowSize-1:-1:1for i=1:m %行数
ifM(i,j)<M(i+1,j)
t=M(i,j);M(i,j)=M(i+1,j);M(i+1,j)=t;
end
end
end
end
%对中间一行从小到大排序,两个元素交换时,该元素所在列对应其他元素也交换
a=floor(windowSize/2)+1;for i=1:windowSize
for j=1:floor(n/windowSize)-i
ifM(a,j)>M(a,j+1)for m=1:windowSize
t=M(m,j);M(m,j)=M(m,j+1);M(m,j+1)=t;
end
end
end
end
f=round((n/windowSize+1)/2);%矩阵中间一行中位数所在位置索引
m1=M(a,f);%中位数的中位数
t=1;
m=1;%A区元素大小无法确定,需依次和中位数比较,小的放到S1,大的放到S2for i=1:a-1for j=1:f-1ifM(i,j)<=m1
S1(t)=M(i,j);
t=t+1;
end
ifM(i,j)>m1
S2(m)=M(i,j);
m=m+1;
end
end
end
%处理D区元素
for i=a+1:windowSize
for j=f+1:floor(n/windowSize)ifM(i,j)<=m1
S1(t)=M(i,j);
t=t+1;
end
ifM(i,j)>m1
S2(m)=M(i,j);
m=m+1;
end
end
end
%C区
for i=a:windowSize
for j=1:f-1S1(t)=M(i,j);
t=t+1;
end
end
%中位数下面两个数比他小,放到S1for s=a+1:windowSize
S1(t)=M(s,f);
t=t+1;
end
%B区
for i=1:a
for j=f+1:floor(n/windowSize)S2(m)=M(i,j);
m=m+1;
end
end
%中位数上面两个数比他大,放到S2for s=1:a-1S2(m)=M(s,f);
m=m+1;
end
x=windowSize*floor(length(arr)/windowSize);for i=x+1:length(arr)ifisnan(arr(i))
end
ifarr(i)<=m1
t=length(S1)+1;S1(t)=arr(i);
end
ifarr(i)>m1
m=length(S2)+1;S2(m)=arr(i);
end
end
x=length(S1);if(k-1==x)
value=m1;return
end
if(k<=x)
value=Select(S1,k);else
value=Select(S2,k-x-1);
end
end
function value=Sort(arr,k)
n=length(arr);for i=1:k
for j=i+1:n
ifarr(i)<arr(j)
t=arr(j);arr(j)=arr(i);arr(i)=t;
end
end
end
value=arr(n-k+1);return;
end