使用交换进行排序练习的问题

时间:2014-04-03 00:06:49

标签: ruby

所以我试图使用交换方法创建一个简单的排序程序,我只是不能让它正常工作。代码似乎很稳定,直到它到达朝鲜蓟为止。在每次迭代过程中,我都经历了“放置”数组的价值,梨与苹果交换,然后与橙子交换,然后与桃子和葡萄柚交换,但当它到达朝鲜蓟时,它拒绝像它应该交换。它似乎也不是它的问题,它是列表中的最后一项,因为如果我添加,让我们说,香蕉到最后它仍然停在朝鲜蓟。最终我想将函数嵌套在'm.times do'函数中以继续交换,直到整个列表被排序,但出于某种原因我放

m.times do
end

围绕'n.times do'它会产生另一个错误。但我想如果我甚至不能让朝鲜蓟与梨交换也没关系。以下是我的代码(是的,我知道有一个.sort函数,这是出于学习目的)。

## Ignore this part, it is just a function I made and commented out to create  
## your own list.
=begin
array = []

while true

    puts "what item would you like to add to your list to be sorted?"
    puts "press enter without entering an item to quit"
    item = gets.chomp

    break if item.empty?

    array.push item

end
=end
##

array = ['pear' , 'apple' , 'orange' , 'peach' , 'grapefruit' , 'artichoke']

i = 0
m = array.length
n = m - 1

    n.times do  

        if array.to_s[i] >= array.to_s[i+1]
            swap = array[i]
            array[i] = array[i+1]
            array[i+1] = swap
         end

        i += 1

    end

puts array

2 个答案:

答案 0 :(得分:0)

我认为你的意思是array[i] >= array[i+1]

array.to_s将从整个数组中创建一个字符串,因此您在字符串化数组中一次比较一个字符,而不是一次比较一个字,就像您打算这样做。

答案 1 :(得分:0)

array = ['pear' , 'apple' , 'orange' , 'peach' , 'grapefruit' , 'artichoke']

m = array.length
n = m - 1

    n.times do  
        i = 0
        n.times do
            if array[i] >= array[i+1]
                temp = array[i]
                array[i] = array[i+1]
                array[i+1] = temp
             end
            i += 1
        end
    end
puts array

在这种称为“冒泡排序”的排序方法中,您需要嵌套循环。在一次运行后,只保证最顶层的元素处于正确的位置。这也被称为这种不良算法的臭名昭着的O(n * n)复杂性。顺便说一句。内循环可以更短,如n-i次。

修正了一些错误:

  • array.to_s[i]错误,因为索引必须应用于数组,而不是to_s方法
  • ...并且没有必要调用to_s,因为此特定数组的元素已经是字符串
  • i = 0必须移至外圈的开始
  • 术语“swap”是指动作,而变量通常称为“temp”