今天为了复习课本上面的程序,就实地检验了下这个程序,当年可是学过微机原理里的冒泡排序的,结果移植平台后又是如此麻烦,呵呵,网上贴吧,论坛,知道,文库上面拜托你们的程序能不能靠谱点!!!
第一种常见的错误就是程序写的一团糟,天马行空,弄了几个位地址和中间变量,外加两个循环,程序早飞了,真是让我们程序员惭愧啊
第二种错误是由于大多参考课本上题目:将以40H为首地址的N个数据进行排序,然后几十行代码,我怎么能很快知道程序对不呢
.................
鉴于此,特在我们这个绿色空间下贴上两种方法实现的冒泡排序完整版,实验程序已全部在keil下调试通过。(为了纪念下今天高考,大哭,好好加油吧)
思路:有序的数列更有利于查找。本程序用的是“冒泡排序”法,算法是将一个数与后面的数相比较,如果比后面的数大,则交换,如此将所有的数比较一遍后,最大的数就会在
数列的最后面。再进行下一轮比较,找出第二大数据,直到全部数据有序。
第一种方法:(缺点是不利于移植,优点是以末尾数字为参照,逻辑简单)
///////////////////////////////
;冒泡排序
;十个数从小到大排序
ORG 0000H
MOV 60H,#02H
;给60-69H存储单元送初值
MOV 61H,#05H
MOV 62H,#03H
MOV 63H,#07H
MOV 64H,#09H
MOV 65H,#14H
MOV 66H,#13H
MOV 67H,#08H
MOV 68H,#01H
MOV 69H,#12H
MOV R0,#60H
MOV R1,#61H
L2: MOV A,@R0
MOV 50H,@R1
CJNE A,50H,NEQ ;比较60H与61H中数值的大小,做减法。如果60中的内容大则C位(进位为0)如果60中的内容比61中的小C位为1
NEQ: JNC EXCHANGE
;是0跳转,左操作数<右操作数
LJMP L3
EXCHANGE: XCH A,@R1
;交换60与61中的内容
XCH A,@R0
L3: INC R1
CJNE R1,#6AH,L2
;让62到69中的内容逐一与60中的比较,最后60中的内容就是最小值
INC R0
MOV 51H,R0
MOV R1,51H
INC R1
CJNE R0,#69H,L2
;让61中的内容与之后的62到69中的内容比较,61中的内容就为第二小值,以此类推,直到剩最后两个数比较完。
SJMP $
END
///////////////////////////////
第二种方法(提倡用该方法,只是两重循环,逻辑性较强,不容易看懂,优点是利于移植)
///////////////////////////////
;冒泡排序
;十个数从小到大排序
Size equ 10 ; 数据个数
Array equ 60h ; 数据起始地址
Change equ 0 ; 交换标志
ORG 0000H
MOV 60H,#02H
;给60-69H存储单元送初值
MOV 61H,#05H
MOV 62H,#03H
MOV 63H,#07H
MOV 64H,#09H
MOV 65H,#14H
MOV 66H,#13H
MOV 67H,#08H
MOV 68H,#01H
MOV 69H,#12H
SORT:
MOV R0, #Array
MOV R7, #Size-1
CLR Change
GOON:
MOV A, @R0
MOV R2, A
INC R0
MOV B, @R0
CJNE A, B, NotEqual
SJMP Next
NotEqual:
JC Next ; 前小后大, 不交换
SETB Change ; 前大后小, 置交换标志
XCH A, @R0 ; 交换
DEC R0
XCH A, @R0
INC R0
Next:
DJNZ R7, GOON
JB Change, SORT
LJMP $
end
///////////////////////////////