初次来到论坛,用个小程序打个招呼。:D
我用MATLAB写程序时,希望用到较少的类C的循环。程序引用MATLAB库的函数尽量少些。我在搜索某个算法的时候看到论坛。大段程序就不贴了。
于是拿个练习的小程序来打个招呼,也许很不完善。呵呵。
欢迎拍砖。
程序如下:
function M=megosort(A) %堆排序算法。
n=size(A,2);
temp=A;
for i=1:n
temp(1,i:n)=metoosort(temp(1,i:n));
end
M=temp;
end
function A=metoosort(A) %求子树最大堆子函数
for i=floor(size(A,2)/2):-1:1
A=megomax(A,i);
end
end
function [A,i]=megomax(A,i) %求单个分支最大堆子函数
if i*2<=size(A,2)
if i*2+1>size(A,2)
if A(i)<=A(2*i)
[A(i),A(i*2)]=swapAB(A(i),A(2*i));
i=2*i;
end
else
key=i;
if A(key)<=A(key*2)
[A(key),A(key*2)]=swapAB(A(key),A(key*2));
i=2*key;
end
if A(key)<=A(2*key+1)
[A(key),A(key*2+1)]=swapAB(A(key),A(key*2+1));
i=2*key+1;
end
if key~=i
[A,i]=megomax(A,i);
end
end
end
end
function [A,B]=swapAB(A,B)
temp=A;
A=B;
B=temp;
end
*******************************************************************************************************************************************************
下面是测试用的 打乱程序。
function [A]=disorganise(B)
A=B*0;
n=size(B,2);
C=B;
for i=1:n
[A(1,i),C]=catm(C);
end
end
function [temp,C]=catm(B)
n=size(B,2);
cma=round(rand(1)*(n-1))+1;
temp=B(1,cma);
C=zeros(1,n-1);
if (cma~=1||cma~=n)
C=[B(1,1:cma-1),B(1,cma+1:n)];
elseif cma==1
C=B(1,2:n);
elseif cam==n
C=B(1,1:n-1);
end
end
%******************************************************************
OK,大家好!
[本帖最后由 moset 于 2011-4-12 11:15 编辑]