Логика пузырьковой сортировки нарушена - PullRequest
0 голосов
/ 10 октября 2019

Каждый раз, когда я изучаю новый язык, я пытаюсь создать в нем пузырьковую сортировку. Я делаю это, потому что он использует значительную часть общей итерации, так что я могу ссылаться на него позже.

Теперь на любом другом языке, на котором я пробовал это (C, Python, VB), это была (максимум) 20-минутная задача ... (бар из C, где я столкнулся с выделением памятипроблемы).

Но в Руби ... я просто не могу заставить это работать. Я следовал той же формуле, которую всегда использовал. Без дальнейших церемоний:

#!/usr/bin/ruby

unsorted = []
swapFlag = 0
count    = 1   # 1 == TRUE, 0 == FALSE
temp     = 0

# Fills array with random numbers
while count != 20
  count += 1
  unsorted[count]=rand(100)
end

# Prints unsorted numbers, for comparison
while count != 0
  print "#{count} #{unsorted[count]} \n"
  count -= 1 
end

print "\n"

limit = unsorted.length


# This section is the problem.
# I'm assuming it's got something to do with the logic of the loop

while swapFlag == 1
  swapFlag = 0
  for count in 1..limit 
    if unsorted[count] > unsorted[count + 1]
      temp = unsorted[count + 1]
      unsorted[count + 1] = unsorted[count]
      unsorted[count] = temp
      swapFlag = 1
    end
  end     
end

count = 0
while count != 20 
  count += 1
  print "#{count} - #{unsorted[count]} \n"
end

Я пытался использовать другой синтаксис цикла if, используя метод .each do ... безрезультатно.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Вы, кажется, даже не входите в цикл while:

swapFlag = 0
...
while swapFlag == 1

Кроме того, этот код может работать, когда вы его исправляете, но он просто не похож на Ruby. Этот метод обучения может быть хорошим для понимания синтаксиса и некоторых основных итераций, но язык предлагает гораздо более функциональные, удобочитаемые и мощные способы достижения этой цели.

0 голосов
/ 11 октября 2019

Флаг обмена никогда не устанавливается на 1

while swapFlag == 1  # <------ HERE IS YOUR BUG, the swapFlag is never set to 1!!!
  swapFlag = 0
  for count in 1..limit 
    if unsorted[count] > unsorted[count + 1]
      temp = unsorted[count + 1]
      unsorted[count + 1] = unsorted[count]
      unsorted[count] = temp
      swapFlag = 1
    end
  end     
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...