1

我需要使用矢量化来删除我的 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
4

2 回答 2

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并将值放回原处。你完成了。

于 2013-04-30T03:18:51.293 回答
1

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

ans=sort(array)

会做的。

于 2013-04-30T03:06:18.780 回答