【问题标题】:Sorting an Array in Ruby without using Sort method在不使用 Sort 方法的情况下在 Ruby 中对数组进行排序
【发布时间】:2012-06-19 18:21:17
【问题描述】:

我正在尝试使用冒泡排序方法对仅包含三个数字的数组进行排序。我正在使用的代码如下。

def my_sort(list)
  return list if list.size <= 1 

  swapped = false

  while !swapped
    swapped = false

    0.upto(list.size-2) do |i|
      if list[i] > list[i+1]
        list[i], list[i+1] = list[i+1], list[i]
        swapped = true
      end
    end

    list
  end

my_sort([3,1,2])

这是我不断收到的错误消息:

Syntax error, unexpected $end, expecting keyword_end

我只是想知道不应该包括哪一端?

【问题讨论】:

标签: ruby


【解决方案1】:

您在swapped = true 之后缺少end。最好彻底准确地缩进代码以避免此类问题:

def my_sort(list)
  return list if list.size <= 1 

  swapped = false
  while !swapped
    swapped = false
    0.upto(list.size-2) do |i|
      if list[i] > list[i+1]
        list[i], list[i+1] = list[i+1], list[i]
        swapped = true
      end
    end
  end

  list
end

【讨论】:

  • 这不起作用。 list = [14,11,36,42,12,10] 将排序数组返回为 [11, 14, 36, 12, 10, 42] 这是错误的。
  • 您的解决方案不起作用;它返回相同的未排序数组。
  • 这是 OPs 代码,但缩进正确并修复了语法错误
【解决方案2】:

您缺少end

  if list[i] > list[i+1]
    list[i], list[i+1] = list[i+1], list[i]
    swapped = true
  end # <--------------------------------------------------------

编辑: 正如其他答案所提到的,缩进您的代码以使这些错误更加明显。

【讨论】:

    【解决方案3】:

    这看起来更好更快

    arr = [1,5,7,2,3,50,78,34, 1, 15, 89, 8]
    
    def sort_array(arr)
      arr.size.times do
        arr.map.with_index do |num, index|
          next if index.eql?(arr.size - 1)
          arr[index], arr[index+1] = arr[index+1], arr[index] if num > arr[index+1]
        end
      end
    end
    

    将上述方法调用为print sort_array(arr)得到预期结果。

    【讨论】:

      【解决方案4】:

      您的代码适用于该特定数组。因为您的循环正在查看下一个元素是否更高,然后滑动。但是数组中的更多元素呢?这是适用于所有情况的递归解决方案。

      def my_sort(list, new_array = nil)
      
        return new_array if list.size <= 0
        if new_array == nil
          new_array = []
        end
        min = list.min
        new_array << min
        list.delete(min)
      
        my_sort(list, new_array)
      
      end
      
      puts my_sort([3, 1, 2, 20, 11, 14, 3, 6, 8, 5])
      

      【讨论】:

        【解决方案5】:

        对我有用的方法如下。

        def my_sort(list)   
          n = list.length   
          loop do
            swapped = false
            (n-1).times do |i|
              if list[i] > list[i+1]
                list[i], list[i+1] = list[i+1], list[i]
                swapped = true
              end
            end
            break if not swapped  
          end   
          list 
        end   
        

        【讨论】:

          【解决方案6】:
          def sort(arr)
              arr_len = arr.length - 1
              swap = true
              while swap
                  swap = false
                  arr_len.times do |i|
                   if arr[i] > arr[i+1]
                     arr[i],arr[i + 1] = arr[i + 1],arr[i]
                     swap = true
                   end
                  end
               end
               p arr
          
          end
          

          【讨论】:

          • 请添加一点解释为什么这个代码应该工作。
          【解决方案7】:
          #Using bubble sort algorithm in ruby
          
          a = [1,5,7,2,3,50,78,34,89]
          
          a.size.times.each do |t|
           i=0
           a.each do |b|
             if b > a[i+1]
               a[i],a[i+1] = a[i+1],a[i]
             end
             i+=1 if i < a.size-2
           end
          end
          print a
          #output: [1, 2, 3, 5, 7, 34, 50, 78, 89]
          

          【讨论】:

          • 不鼓励仅使用代码的答案,因为它们没有说明如何解决问题。请更新您的答案,以解释这如何改进该问题已有的其他已接受和赞成的答案。此外,这个问题已有 5 年历史,最近有未回答问题的用户会更加感谢您的努力。请查看How do I write a good answer
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-19
          • 1970-01-01
          • 2015-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-27
          相关资源
          最近更新 更多