Bubble Sort используя только IF и GOTO - PullRequest
0 голосов
/ 30 января 2019

Итак, я хочу реализовать пузырьковую сортировку на одномерном массиве с некоторыми ограничениями.Я должен использовать только IF и GOTO [Label number] в дополнение к операторам присваивания и сравнениям.Другими словами, я могу использовать только IF и GOTO для выполнения цикла.Обычно мне не трудно эмулировать циклы, используя GOTO и IF, но когда это вложенный цикл, я не могу найти правильный путь.Это моя работа до сих пор, для справки

  0       integer i,j,arr_size
  1       character*26 arr(1000), tmp
  2       i = 1
  3       j = 1
  4  299  if(i<arr_size) go to 300
  5       go to 305
  6  300  if(j<arr_size) go to 301
  7       go to 304
  8  301  if(arr(i) .gt. arr(j)) go to 302
  9       go to 303
 10  302  tmp = arr(j)
 11       arr(j) = arr(i)
 12       arr(i) = arr(j)
 13       j = j + 1
 14       go to 299
 15  303  j = j + 1
 16       go to 300
 17  304  j = 1
 18       i = i + 1
 19       go to 299
 20  305  return
 21       end

Есть идеи?
Спасибо!

1 Ответ

0 голосов
/ 30 января 2019

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

Помимо уже обнаруженной проблемы (строка 12), в конце первого цикла элемент min будетположение 1 и внутренний цикл может начинаться с j = 2.Таким образом, строка 17 может быть j=i+1 для небольшой оптимизации.

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

             integer i,j,arr_size
             character*26 arr(1000), tmp
             i = 1
  startouter if(i>=arr_size) go to endouter
             j=1
  startinner if(j>=arr_size) go to endinner
             if(arr(j) .le. arr(j+1)) go to noswap
             tmp = arr(j)
             arr(j) = arr(j+1)
             arr(j+1) = tmp
  noswap     j = j + 1
             go to startinner
  endinner   i = i + 1
             go to startouter
  endouter   return
             end
...