【问题标题】:Vectorising while loop MATLAB insertion sort向量化while循环MATLAB插入排序
【发布时间】:2013-04-23 20:40:55
【问题描述】:

我需要使用矢量化来删除我的 for 循环中的嵌套 while 循环,以制作插入排序程序。我的 for 循环中不允许有 while 循环,我必须这样做,“这样你的函数中除了最外层的 for 循环外没有 while 或 for 循环。”

这是我目前拥有的代码

 function insertsort(array)

 array = [2 1 3 2 1]

for i = 2:length(array)
    value = array(i);
    j = i - 1;

    while (j >= 1) && (array(j) > value)
       array(j+1) = array(j);
       j = j-1;
    end

   array(j+1) = value;

end %forLoop



 disp(array);
end %insertionSort

【问题讨论】:

    标签: matlab sorting for-loop while-loop insertion-sort


    【解决方案1】:

    您是否有不想使用内置sort 的原因?

    ans=sort(array)
    

    会做的。

    【讨论】:

      【解决方案2】:

      这样就可以了:

      array = [2 1 3 2 1]
      
      for i = 2:length(array)
          value = array(i);
          j = i - 1;
      
          array_j=array(1:j);
          array_j_indices=cumsum(array_j>value);
          [~,n]=find(array_j_indices==1);
          newArray=array;
          array(n+1:i)=array_j(array_j>value);
          j=j-max(array_j_indices);
          array(j+1) = value;
      
      end %forLoop
      
      disp(array);
      

      解释:首先在一个数组中从j1 获取元素,因为while 循环最终会扫描这些元素。找出哪些元素大于该值并取其累积和,这将告诉我们有多少元素大于value。因为这是我们必须减少 j 的数量。现在,找到第一个 1 出现的位置(即数字大于 value 的第一个索引,因为我们必须将每个元素从该索引向右移动 1 个位置)。之后,递减 j 并将值放回原处。你已经完成了。

      【讨论】:

        猜你喜欢
        • 2015-07-06
        • 2013-02-18
        • 1970-01-01
        • 2023-03-22
        • 2016-03-18
        • 2019-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多