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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top