2009-03-09 9 views
7

Ich habe gerade den Kurs MIT Einführung in Algorithmen durch das Online-Material gestartet. Neben dem Kurs habe ich mich auch entschieden, meine Ruby-Fähigkeiten zu verbessern, indem ich die darin enthaltenen Algorithmen kodiere.Einführung in die Lernumgebung Sortieren in Ruby

Ich bin auf dem ersten Algorithmus gegeben, die Insertion Art ist, und ich habe den folgenden Code eingegeben hat, aber ich bin immer diese Fehlermeldung, wenn ich es laufen:

insertionsort.rb: 5: in ` > ': Vergleich von Fixnum mit Null fehlgeschlagen (Argumente)

def insertionsort(num) 
for j in 2..num.length 
    key = num[j] 
    i = j - 1 
    while i > 0 and num[i] > key 
     num[i+1] = num[i] 
     i = i - 1 
    end 
    num[i+1] = key 
end 
puts num 
end 

numbers = [23,34,46,87,12,1,66] 

insertionsort(numbers) 

ich bin sicher, dass es ein recht einfaches Problem ist, aber ich kann einfach nicht begreifen, was es im Moment ist. Jede Hilfe oder Tipps würden sehr geschätzt werden.

Antwort

6

Sie überschreiten die Grenzen Ihres Arrays. Das Beispiel, das Sie erhielten, ging von 1-indizierten Arrays aus, aber Arrays in Ruby sind 0-indexiert. Die erste Zeile soll

for j in 1...num.length 
+0

Danke, ich dies gerade angefangen zu programmieren, nachdem ich den Vortrag getan hätte beobachtet, die Arrays auf 1 –

6

sein Die andere Antwort ist richtig, dass Sie in der Anordnung nach dem Ende der Werte gehen, weil es 0-basiert ist, aber es gibt auch andere Änderungen, die Sie benötigen, um die Algorithmus Arbeit zu machen :

for j in 1..(num.length - 1) 

und

while i >= 0 and num[i] > key 
+0

Start verwendet Ja, sobald ich meinen ersten Fehler erkennen ich den Rest korrigiert. Vielen Dank. –

+0

Ja, guter Fang. –

+0

Akzeptierte Antwort funktioniert nicht, aber das funktioniert. – shin

0

nur eine kleine Ergänzung zu den anderen, sehr guten Antworten:

Ich glaube, es ist mittlerweile allgemein akzeptiert, dass die 0-Origin-Indexierung eine Reihe von praktischen und empirischen Vorteilen gegenüber der 1-Origin-Indexierung bietet. Die Erfahrung zeigt, dass es einfach "besser funktioniert" und weniger fehleranfällig ist.

Das ist der Grund, warum eine Menge Programmierer die Dinge von Null an zählen und "normale" Leute in Erstaunen versetzen.

+0

Acht Jahre später stimmte jemand diese Antwort ab. Ich wette, du bist wirklich stolz auf dich selbst, aber wenn du den Grund in einem Kommentar teilen könntest, könnten wir alle etwas lernen! –

0

Die einfachste Implementierung ist so etwas wie dies:

def insertion_sort(arr) 
    for i in (1...(arr.size)) 
    if arr[i-1] > arr[i] 
     i.downto(1) do |el| 
     if arr[el] < arr[el-1] 
      arr[el-1], arr[el] = arr[el], arr[el-1] 
     end 
     end 
    end 
    end 
    arr 
end 

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

p insertion(arr) 

Hinweis: um die Effizienz des Algorithmus zu verbessern, können Sie die binäre Suche nach Elementen Vergleich verwenden.

What Is Insertion Sort ?