矢量化循环MATLAB插入排序

时间:2013-04-30 02:20:08

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

我需要使用向量化来移除for循环中的嵌套while循环,以进行插入排序程序。我不允许在for循环中有一个while循环,我必须这样做“这样你的函数中没有while或for循环,除了最外面的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

2 个答案:

答案 0 :(得分: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并将值返回。你完成了。

答案 1 :(得分:1)

您是否有理由不想使用内置的sort

ans=sort(array)

会这样做。