2013-04-30 55 views
1

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

这里是我的代码目前

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 

回答

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,并将其返回。你完成了。