仅使用 IF 和 GOTO 的冒泡排序

Bubble Sort using only IF and GOTO

所以我想在一维数组上实现冒泡排序,但有一些限制。除了赋值语句和比较之外,我应该只使用 IFGOTO [Label number]。也就是说,我只能用IFGOTO做循环。通常,我发现使用 GOTOIF 来模拟循环并不难,但是当它是嵌套循环时,我找不到正确的方法。这是我目前的工作,供参考

  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

有什么想法吗?
谢谢!

我认为您的代码更像是一种选择排序形式,而不是真正的冒泡排序。当您的算法在数组的开头写入最小元素时,冒泡排序应该交换相邻元素,

除了已经发现的问题(第 12 行),在第一个循环结束时,最小元素将在位置 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