2013-04-30 4 views
1

Je dois utiliser la vectorisation pour supprimer la boucle while imbriquée dans ma boucle for, pour créer un programme de tri d'insertion. Je ne suis pas autorisé à avoir une boucle while dans ma boucle for, je dois le faire "de telle sorte qu'il n'y ait pas de temps ou de boucles dans votre fonction sauf la boucle la plus externe."Vectorisation en boucle Tri d'insertion MATLAB

Voici le code que j'ai actuellement

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 

Répondre

1

Y at-il une raison que vous ne voulez pas utiliser le construit en sort?

ans=sort(array) 

le fera.

2

Cela fera:

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

Explication: Tout d'abord prendre des éléments de j à 1 dans un tableau, puisque la boucle while finira par balayer par ces éléments. Trouvez lequel des éléments est supérieur à la valeur et prenez sa somme cumulative qui nous dira combien d'éléments sont plus grands que le value. Parce que c'est le montant que nous devons décrémenter j par. Maintenant, trouvez où se produit le premier 1 (c'est-à-dire le premier index où le nombre est supérieur à value, puisque nous devons déplacer chaque élément vers la droite d'une position à partir de cet index). Après cela, décrémentez j et replacez la valeur. Vous avez terminé.