uscita sbagliata in Python - secondo la mia logica
Domanda
Qualcuno può dirmi il motivo per cui il mio programma sta funzionando strano. Sto cercando di ordinare list1
in ordine crescente. Questo codice fa parte del mio programma quick sort Sto cercando di scrivere. Come per la mia logica che Mi candido in questo codice, e ho controllato manualmente troppo, l'uscita dovrebbe essere [1,2,3,4,5]. Tuttavia l'uscita viene rivelata [1,2,2,4,5]. Si può dire che cosa sta andando male?
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
Modifica Quello che sto cercando di fare è in questo modo:
mi metto a confronto il primo elemento con le seguenti (n-1) elementi e scambiare l'elemento più piccolo con il primo. Ora vado a 2 ° elemento e confrontarla con le seguenti (n-2) elementi e di scambio con l'elemento più piccolo tra quelli (n-2) elementi. Ti piace questa mi muovo in avanti.
Nota: Questo fa parte del mio programma Quicksort e non è di per sé quicksort. Questa parte è per la list1
a cui assegno numeri meno di perno. Un altro codice sarà per list2
dove sarò assegnare numeri maggiori di perno.
Soluzione
La risposta fornita da RBP è assolutamente corretta!
Inoltre, penso che si potrebbe semplificare il sopra da Remove contano per sé, anche elencare direttamente la lista e utilizzare il pitone linguaggio - a, b = b, a scambiare i valori
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
Output:
[1, 2, 3, 4, 5, 6]
[Edit: A proposito del linguaggio]
>>> 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
>>>
Altri suggerimenti
Dal momento che proprio count = count + 1
prima della for
più interno, non si ottiene mai a raggiungere la prima posizione di list1 (list1[0]
), che è l'elemento "3".
[Modifica] Guardando più attentamente il codice, sembra che ci sia un sacco di confusione. Per esempio, il
list1[position1]=list1[position2]
list1[position2]=temp
temp=list1[position1]
Stai perdendo lista1 [posizione1]: si sta sovrascrivendo con la lista [Posizione2], prima di cercare di salvarla alla variabile TEMP. Provare a spostare temp=list1[position1]
alla prima riga dopo il if
.
E, onestamente, l'implementazione è eccessivamente complicato. Vi suggerisco di provare a scrivere in pseudo-codice, cerco di capire realmente cosa sta succedendo, e poi ri-attuazione.
Un piccolo miglioramento alla risposta corretta di pyfunc ... Questa linea
for position2 in range(position1,n_list1)
può essere
for position2 in range(position1+1,n_list1)
e vi farà risparmiare un po 'di tempo.