2017-04-22 3 views
-1

Ich beginne in Ruby und ich weiß nicht, warum das passiert. das ist mein Code.Vergleich von Fixnum mit Nil fehlgeschlagen (ArgumentError)

def buble_sort(a) 
    i = 0 
    print a.size() 
    while i < a.size() do 
     if a[i] > a[i+1] then 
      temp = a[i] 
      a[i] = temp 
      a[i+1] = a[i] 
     end 
     i = i + 1 
    end 
    return a 
end 

puts "Amount of elements in your array" 
n = gets.chomp.to_i 
a = [] 
n.times do |num| 
    puts "input your element #{num}" 
    a <<gets.chomp.to_i 
end 
puts a 
a = buble_sort(a) 
puts "Array sorted #{a}" 

Und die Ausgabe geben Sie mir diesen Fehler: 4burbuja.rb: 6: in >': comparison of Fixnum with nil failed (ArgumentError) from burbuja.rb:6:in buble_sort ' von burbuja.rb: 24: in `'

+0

In Ihrer while-Schleife Sie 'Temp haben wird, laufen = a [i]' gefolgt von 'a [i] = temp' das zu erreichen, ist nichts. Ich denke du willst 'temp = a [i + 1]' 'a [i + 1] = a [i]' 'a [i] = temp' oder, in mehr idiomatischem Rubin,' a [i + 1], a [i] = a [i], a [i + 1] '. – GSP

+0

Yep, ich erkannte, dass nachdem ich um Hilfe gebeten XD. –

Antwort

-1

Ich verstehe, dass Sie lernen, Rubin und wollen um deine eigene Blasensorte zu implementieren. a.sort ist einfach, lehrt aber nichts. Ich bin froh, dass du gerade lernst! Es gibt einen Fehler in Ihrer Blasensortierungsmethode. Sie erhöhen i und verwenden es als Index für Ihr Array bei jeder Iteration. Es könnte viele Iterationen dauern, um im schlimmsten Fall dauert es n ** 2 (n Quadrat) Iterationen, die deutlich mehr als die Elemente in Ihrem Array sein wird. Wenn Ihr Code jedoch so funktioniert hat, wie ich es erwartet habe, würde er nur einen Durchlauf auf dem Array machen.

Dies ist eine klassische Rubin-Blase Sorte. (mit dem Sie den Benutzer füllen das Array von der Konsole) Beachten Sie, dass wir das gesamte Array weiter verarbeiten, bis wir keine Werte mehr tauschen müssen.

def bubble_sort(array) 
    n = array.length 
    puts "Sorting your array of #{n} items" 
    loop do  #will loop forever till we break 
       #When we go through the entire array 
       #and don't have to swap then the array 
       #is sorted 
    swapped = false 

    (n-1).times do |i| 
     print "*" #just to illustrate how many iterations occur 
     if array[i] > array[i+1] 
     array[i], array[i+1] = array[i+1], array[i] #swap these values, no pesky temp variable 
     swapped = true 
     end 
    end 

    break if not swapped #we are done exit the loop 
    end 

    array #return the sorted array 
end 

puts "Amount of elements in your array" 
n = gets.chomp.to_i 
a = [] 
n.times do |num| 
    puts "input your element #{num}" 
    a <<gets.chomp.to_i 
end 
puts a 
a = bubble_sort(a) 
puts "Array sorted #{a}" 

Hier ist ein Beispiel dafür über eine Konsole

Cyclops% ruby sort_test.rb 
Amount of elements in your array 
6 
input your element 0 
5465463 
input your element 1 
3421 
input your element 2 
432143 
input your element 3 
234123 
input your element 4 
645 
input your element 5 
1 
5465463 
3421 
432143 
234123 
645 
1 
Sorting your array of 6 items 
****************************** 
Array sorted [1, 645, 3421, 234123, 432143, 5465463] 
Cyclops% 
Verwandte Themen