2016-04-03 10 views
1

Ich versuche ein Array zu sortieren, wo es von der zweiten Nummer beginnt und schaut sich die eine an, um zu sehen, ob die vorherige Nummer größer ist. Wenn es so ist, möchte ich die Zahlen tauschen, ansonsten die Nummer dort behalten, wo sie ist. Momentan macht das mein Code nicht. Wenn ich das Array unten eingabe, ändert sich nur die 2 zu einer 11, was mir zwei 11 in der Mitte gibt. Was läuft falsch?Python Swap-Sortierung gibt keine korrekte Ausgabe

#given an array of digits a of length N 
a = [7, 3, 11, 2, 6, 16] 
N = len(a) 

# moving forward along a starting from the second position to the end 

# define _sillysort(a, start_pos): 
#  set position = start_pos 
#  moving backwards along a from start_pos: 
#   if the a[position-1] is greater than a[position]: 
#    swap a[position-1] and a[position] 
def sillysort(a, start_pos): 
    a_sorted = [] 
    start_pos = a[1] 
    for position in a: 
     if a[start_pos-1] >= a[start_pos]: 
      a[start_pos-1], a[start_pos] = a[start_pos], a[start_pos-1] 
     else: 
      a[start_pos-1] = a[start_pos] 
     a_sorted.append(position) 
     position += 1 
    return a_sorted 

Wenn ich dies ausführen, sillysort (a, N), habe ich diesen Ausgang [7, 3, 11, 11, 6, 16].

Antwort

0

Ihr Code hat ein paar Probleme

start_pos = a[1]

Wenn Sie bereits start_pos als Argument an die Funktion, die Bereitstellung, warum Sie es in der Funktion werden neu initialisiert. Darüber hinaus, wenn a das Array ist, das Sie sortieren möchten, warum ist die start_pos Ihres Algorithmus das zweite Element des Arrays a selbst?

for position in a: 
     if a[start_pos-1] >= a[start_pos]: 
      a[start_pos-1], a[start_pos] = a[start_pos], a[start_pos-1] 
     else: 
      a[start_pos-1] = a[start_pos] 
     a_sorted.append(position) 
     position += 1 

Die for in Schleife iteriert durch das Array a und position werden die Werte der Elemente des Arrays treffen. In Ihrem Beispiel position werden die Werte in der folgenden Reihenfolge erfolgen:

7, 3, 11, 2, 6, 16

Was ich nicht verstehe ist, warum Erhöhen Sie Position 1 am Ende des für die Schleife. Und wieder verwenden Sie die Werte innerhalb des Arrays, um das Array und nicht die Indizes selbst zu indizieren.

Da in Ihrem Beispiel start_pos den Wert a[1] dh 3 annehmen wird, vergleicht Ihr Code a [3] und a [2] also 2 und 11 und geht in die else-Bedingung und macht a [3] = a [2 ] und daher erhalten Sie 11 in der Position von 2

Sie haben sich wahrscheinlich mit den Variablennamen verwechselt. Sehen Sie, ob Ihnen das hilft.

Verwandte Themen