【问题标题】:Sorting numbers in the list without using sort command不使用排序命令对列表中的数字进行排序
【发布时间】:2019-01-14 22:07:00
【问题描述】:

我试图在不使用 Matlab 中的排序命令的情况下对列表中的数字进行排序。我找不到我的代码有什么问题。

这是我尝试过的:

clc
A= [1 2 4 0 0 8]
B=[]
for i=1:length(A)
    indx=find(A==min(A))
    for j=1:length(indx)
        B(i)=A(indx(j))
    end
    A(indx(1):indx(length(indx)))=[]
    B
end

结果是:

    B =

 0     1     2     4     8


indx =

1×0 empty double row vector

Index exceeds the number of array elements (0).

B 的期望值为

B =

    0     0     1     2     4     8

【问题讨论】:

  • 你的错误是什么?该错误告诉您有关您在循环中执行的迭代次数的什么信息?为什么会这样? (提示:每次迭代你从A 中删除了多少元素?)
  • 这里发生的情况是,在第二个中,B(1)=A(index(1)) 和 B(1)= A(index(2))。我想要的是 B(2)= A(index(2))
  • 不是您的错误的来源,但这是什么? A(indx(1):indx(length(indx)))?这需要第一个和最后一个匹配之间的所有元素,而不仅仅是匹配。为什么不只是A(indx)?此外,indx(length(indx))indx(end) 相同(但更慢)。
  • @fyec,你说得对,这是问题之一。为了解决这个问题,您需要为j 的每次迭代增加B(i)。所以也许B(i+j-1) = A(indx(j))?但这不是给你错误信息的原因。
  • 错误来自@CrisLuengo 提到的删除多个匹配项的行,但仍迭代A 的原始长度。您只是用完了要匹配的元素,当indx == [] 时,indx(1) 不存在。要解决这个问题,我会将您的 for i... 循环更改为 while ~isempty(A),只要 A 有元素需要排序,它就会继续循环。

标签: matlab sorting numbers


【解决方案1】:

这个更正你的代码:

A= [1 2 4 0 0 8];
L=length(A);
B=zeros(1,L);
k=1;
for i=1:L
    indx=find(A==min(A));
    for j=1:length(indx)
        B(k)=A(indx(j));
        k=k+1;
    end
    A(indx)=[];
    B
end

您的代码中的问题是,在找到最小值后的任何时候,您都会在 B 上的当前数据上覆盖它们(因为在第二个 for 中,您总是从索引 1 开始)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多