MatLab:排序两个行向量

时间:2013-12-11 20:22:39

标签: matlab

我有两个行向量(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

非常感谢任何帮助。

2 个答案:

答案 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返回时它不会。