气泡排序仅使用IF和GOTO

时间:2019-01-30 13:16:43

标签: algorithm loops bubble-sort 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

有什么想法吗?
谢谢!

1 个答案:

答案 0 :(得分:2)

我认为您编写的代码不是真正的冒泡排序,而是选择排序的一种形式。当您的算法在数组的开头写入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