我有两个行向量(i_1,i_2,...,i_n)和(b_1,b_2,...,b_n),其中i_1对应于b_1。 我需要考虑i元素不一定是有序的情况所以必须进行排序,我该如何做,同时确保重新排列b元素,使它们仍然对应于正确的i元素。我有以下需要使用的排序代码,但我不确定如何调整它以满足我的需要。
function [ out ] = myMsort( a )
%MYMSORT returns a sorted version of the input row vector, by merging
% Merge sort: running time O(n log n) with n elements to sort
% But really quite inefficient for small n
n=length(a);
if (n==1)
out=a; return
end
out=myMerge(myMsort(a(1,1:floor(n/2))),myMsort(a(1,floor(n/2)+1:n)));
end
其中调用的函数如下
function [ out ] = myMerge( a,b )
% MYMERGE: takes two sorted row vectors and produces the (sorted) merge
% running time linear in output size
out=zeros(1,length(a)+length(b)); % Avoid growing array!
j=1;k=1;l=1;
while (j<=length(a))&&(k<=length(b))
if (a(1,j)<b(1,k))
out(1,l)=a(1,j); j=j+1;l=l+1;
else
out(1,l)=b(1,k); k=k+1;l=l+1;
end
end
while (j<=length(a))
out(1,l)=a(1,j); j=j+1;l=l+1;
end
while (k<=length(b))
out(1,l)=b(1,k); k=k+1;l=l+1;
end
end
非常感谢任何帮助。
答案 0 :(得分:1)
您可以修改代码以接受多行数据,但仍然只是根据第一行中的值对所有列进行排序。这只需要进行少量更改:首先,将length(a)
或length(b)
的每个实例更改为size(a,2)
和size(b,2)
。然后确保在合并分配中使用:
索引运算符而不是1
来传输该列中的所有元素。
function [ out ] = myMsort( a )
n=size(a,2);
if (n==1)
out=a;
return
end
out=myMerge(myMsort(a(:,1:floor(n/2))),myMsort(a(:,floor(n/2)+1:n)));
end
function [ out ] = myMerge( a,b )
out=zeros(size(a,1),size(a,2)+size(b,2)); % Avoid growing array!
j=1;k=1;l=1;
while (j<=size(a,2))&&(k<=size(b,2))
if (a(1,j)<b(1,k))
out(:,l)=a(:,j);
j=j+1;l=l+1;
else
out(:,l)=b(:,k);
k=k+1;l=l+1;
end
end
while (j<=size(a,2))
out(:,l)=a(:,j);
j=j+1;l=l+1;
end
while (k<=size(b,2))
out(:,l)=b(:,k);
k=k+1;l=l+1;
end
end
现在您可以像这样运行代码:
n = 100;
i = rand([1 n]);
b = rand([1 n]);
out = myMsort([i;b]);
out
将是一个包含两行的矩阵:第1行是i
的排序值,第2行是b
的对应值。
答案 1 :(得分:0)
只是稍加修改,这是我的例子:
a = [12,4,1,2,8,7];
进入myMsort,我改变了:
out=myMerge(myMsort(a(1:floor(n/2))),myMsort(a(floor(n/2)+1:n)));
其中所有行都已排序。
我真的不明白a部分是两行
修改强>
这里是完整的myMsort函数:
function [ out ] = myMsort( a )
%MYMSORT returns a sorted version of the input row vector, by merging
% Merge sort: running time O(n log n) with n elements to sort
% But really quite inefficient for small n
a = reshape(a,1,size(a,1)*size(a,2));
n=length(a);
if (n==1)
out=a; return
end
out=myMerge(myMsort(a(1:floor(n/2))),myMsort(a(floor(n/2)+1:n)));
end
请注意,我正在使用reshape来制作单行数组。您可以使用其他功能自己完成。问题在于递归你需要是2行向量但是当myMerge返回时它不会。