2013-04-30 104 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,並將其返回。你完成了。