matlab二次取中求第K小

matlab二次取中求第K小

function main()    
        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:1           
				for i=1:m       %行数
					if M(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
			if M(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,大的放到S2
	  for i=1:a-1
	  	for j=1:f-1
	  		if M(i,j)<=m1
	  			S1(t)=M(i,j);
	  			t=t+1;
			  end
			   if M(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)
	  		if M(i,j)<=m1
	  			S1(t)=M(i,j);
	  			t=t+1;
			  end
			   if M(i,j)>m1
	  			S2(m)=M(i,j);
	  			m=m+1;
			  end
		  end
      end
      %Cfor i=a:windowSize
	  	for j=1:f-1
	  		S1(t)=M(i,j);
	  		t=t+1;
		  end
	  end
      %中位数下面两个数比他小,放到S1
      for s=a+1:windowSize
	  S1(t)=M(s,f);
      t=t+1; 
      end
	  
      %Bfor i=1:a
	  	for j=f+1:floor(n/windowSize)
	  		S2(m)=M(i,j);
	  		m=m+1;
		  end
	  end
      %中位数上面两个数比他大,放到S2
      for s=1:a-1
	  S2(m)=M(s,f);
      m=m+1;
      end	  
      x=windowSize*floor(length(arr)/windowSize);
      for i=x+1:length(arr)
          if  isnan(arr(i))
          end
          if arr(i)<=m1
              t=length(S1)+1;
              S1(t)=arr(i);	  			
          end
           if arr(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
        if arr(i)<arr(j)
            t=arr(j);
            arr(j)=arr(i);
            arr(i)=t;
        end
        end
    end
       value=arr(n-k+1); 
       return;       
  end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值