2013-04-30 3 views
1

Мне нужно использовать векторию для удаления вложенного цикла while внутри цикла for для создания программы сортировки вставки. Мне не разрешено иметь цикл while внутри цикла for, я должен сделать это «так, чтобы в вашей функции не было ни времени, ни циклов, кроме самого внешнего цикла».Vectorising while loop MATLAB inserting sort

Вот код, я в настоящее время

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); 

Пояснение: Во-первых принять элементы из j в 1 в массиве, так как while цикл будет в конечном итоге сканировать через эти элементы. Найдите, какой из элементов больше значения, и возьмите его суммарную сумму, которая сообщит нам, сколько элементов больше, чем value. Потому что это сумма, которую мы должны уменьшить j. Теперь найдите, где происходит первый 1 (т. Е. Первый индекс, в котором число больше value, так как мы должны сдвинуть каждый элемент вправо на 1 позицию от этого индекса). После этого уменьшите значение j и верните значение. Вы сделали.