所以我想在一维数组上实现冒泡排序,但有一些限制。除了赋值语句和比较之外,我应该只使用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
有什么想法吗?
谢谢!
答案 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