2010-09-30 5 views
0

Quelqu'un peut-il me dire pourquoi mon programme fonctionne bizarrement. J'essaie de trier list1 dans l'ordre croissant. Ce code fait partie de mon programme de tri rapide que j'essaie d'écrire. Selon ma logique que j'applique dans ce code, et j'ai vérifié manuellement aussi, la sortie devrait être [1,2,3,4,5]. Cependant la sortie sortira pour être [1,2,2,4,5]. Pouvez-vous dire ce qui ne va pas?Mauvaise sortie en Python - selon ma logique

list1=[3,2,1,5,4] 
n_list1=len(list1) 
count=0 

for position1, item1 in enumerate(list1[0:n_list1]): 
    temp=item1 
    count=count+1 
    for position2 in range(count,n_list1): 
     if list1[position1]>list1[position2]: 
      list1[position1]=list1[position2] 
      list1[position2]=temp 
      temp=list1[position1] 
print list1 

EDIT: Ce que je suis en train de faire est comme ceci:

je commence à comparer le premier élément avec les éléments suivants (n-1) éléments et remplacez l'élément le plus petit avec le premier. Maintenant, je vais au 2ème élément et le compare avec les éléments (n-2) suivants et permute avec le plus petit élément parmi ces éléments (n-2). Comme ça, je vais de l'avant.

Remarque: Cela fait partie de mon programme quicksort et ce n'est pas en soi un système de chargement rapide. Cette partie est pour le list1 auquel j'attribue des nombres moins que le pivot. Un autre code sera pour list2 où j'attribuerai des nombres plus grands que le pivot.

Répondre

2

La réponse fournie par rbp est absolument correcte!

Aussi, je pense que vous pouvez simplifier ci-dessus par le nombre de supprimer lui-même, aussi énumérer directement la liste et utiliser le langage python - a, b = b, a pour échanger les valeurs

list1=[3,2,1,6,5,4] 
n_list1 = len(list1) 
for position1, item1 in enumerate(list1): 
    for position2 in range(position1,n_list1): 
     if list1[position1]>list1[position2]: 
      list1[position1] , list1[position2] = list1[position2], list1[position1] 
print list1 

Sortie:

[1, 2, 3, 4, 5, 6] 

[Edit: A propos de l'idiome]

>>> a = 4 
>>> b = 5 
>>> a , b = b, a 
>>> a 
5 
>>> b 
4 
>>> c = 5 
>>> d = 6 
>>> t = c 
>>> c = d 
>>> d = t 
>>> c 
6 
>>> d 
5 
>>> 
+0

@Harpreet: Voir ma page mise à jour – pyfunc

4

Depuis que vous faites count = count + 1 juste avant le plus interne for, vous ne parvenez jamais à atteindre la première position de list1 (list1[0]), qui est l'élément "3". [Modifier] En regardant plus attentivement votre code, il semble y avoir beaucoup de confusion. Par exemple, sur

 list1[position1]=list1[position2] 
     list1[position2]=temp 
     temp=list1[position1] 

Tu perds list1 [position1]: vous écrasez avec la liste [Position2], avant d'essayer de l'enregistrer à la variable temp. Essayez de déplacer temp=list1[position1] à la première ligne après le .

Et, honnêtement, votre implémentation est trop compliquée. Je vous suggère de l'écrire en pseudo-code, d'essayer de comprendre ce qui se passe, puis de le ré-implémenter.

+0

Cela ne fait pas ce que vous croyez. Comme je l'ai mentionné sur mon montage, vous sautez trop de cerceaux. Jetez un oeil à la mise en œuvre de Jon Bentley, est très propre et devrait vous faire mieux comprendre quicksort: http://www.youtube.com/watch?v = aMnn0Jq0J-E (c'est aussi sur le livre "Beautiful Code", si vous y avez accès) – rbp

+0

Un autre point mineur: enumerate (list1 [0: len (list1)]) est fondamentalement la même chose que enumerate (list1) . – rbp

+0

Ce que j'essaie de faire est comme ceci: Je commence à comparer le premier élément avec les éléments (n-1) suivants et permuter le plus petit élément avec le premier. Maintenant, je vais au 2ème élément et le compare avec les éléments (n-2) suivants et permute avec le plus petit élément parmi ces éléments (n-2). Comme ça, je vais de l'avant. – Pupil

0

Une petite amélioration de réponse de pyfunc ... Cette ligne

for position2 in range(position1,n_list1) 

peut être

for position2 in range(position1+1,n_list1) 

et vous permettra d'économiser un peu de temps.

Questions connexes