2017-01-21 5 views
0
for i:= 1 to 5 do 
     begin 
     temp := data[i]; 
     bawah := 1; 
     atas := i; 
     k:=i; 
     while (bawah < atas) do 
      begin 
      tengah := (bawah + atas) div 2; 

      if (temp <= data[tengah]) then 
       atas := tengah 
      else 
       bawah := tengah + 1; 
      end; 

      while (k > atas) do 
      begin 
       data[k] := data[k - 1]; 
       data[atas] := temp; 
       k-=1; 
      end; 
     end; 

problème est, un tableau ordonné ne sont pas tout à fait le résultat est comme ceci:Insertion binaire Tri algorithme double sortie

enter image description here

Répondre

1

Vous effectuez l'affectation suivante trop tôt:

data[atas] := temp; 

Lors d'une prochaine itération de la boucle, la valeur de k-1 deviendra atas, et le La valeur ong sera copiée à data[k], entraînant des doublons et une perte de la valeur d'origine qui était data[atas].

donc déplacer cette ligne de la boucle: il doit être exécuté que lorsque l'opération de changement est terminée:

 while (k > atas) do 
     begin 
      data[k] := data[k - 1]; 
      k-=1; 
     end; 
     data[atas] := temp; 
+0

ok .. merci pour l'explication monsieur –

+0

Vous êtes les bienvenus ;-) – trincot