最简短且高效的排序程序
2016-01-25 11:51
375 查看
要求使用 MCS-51 单片机,进行数据排序。
1.对8个数据进行递增排序;
2.需要排序的数据存在内部数据存储器30H-37H地址单元中,分别为 34H,56H,23H,90H,32H,68H,09H,75H;
3.排序后数据存在内部数据存储器30H-37H地址单元中。
悬赏分:20 | 解决时间:2011-9-24 10:06 |
最佳答案:
;-----------------------------------------------------
ORG 0000H
MOV 30H, #34H
MOV 31H, #56H
MOV 32H, #23H
MOV 33H, #90H
MOV 34H, #32H
MOV 35H, #68H
MOV 36H, #09H
MOV 37H, #75H
CALL SORT
SJMP $
;-----------------------------------------------------
SORT: ;最简短、高效的排序程序.
MOV B, #7 ;第一轮排序时,比较7次.
S1: MOV R0, #30H ;数据区的起始地址.
CLR PSW.5 ;清除"交换"标志位.
MOV R7, B
S2: MOV A, @R0 ;取前一个数.
INC R0
CLR C
SUBB A, @R0 ;减后一个数,前<后时,Cy=1
S3: JC S4 ;有借位时,不用交换,转移.
MOV A, @R0 ;取后一个数,准备交换.
DEC R0
XCH A, @R0 ;交换到前一个.
INC R0
XCH A, @R0 ;交换到后一个.
SETB PSW.5 ;设定"交换"标志位.
S4: DJNZ R7, S2 ;继续本轮比较.
JNB PSW.5, ENDS ;如本轮没有进行过交换,可提前结束.
DJNZ B, S1 ;下一轮,比较次数少一次.
ENDS: RET
;-----------------------------------------------------
END
;=====================================================
回答时间:2011-9-23 20:27
回答者:做而论道 | 十五级 采纳率:43%
原题网址:http://zhidao.baidu.com/question/322526862.html
;=====================================================
后记:
这个排序程序,是做而论道经过多年的精心研究编写出来的,在各种书籍、网文中,从没有与此相同的程序。
本程序有如下一些特点:
1.使用了“冒泡法”。
2.可检测序列是否已经排好,具有提前退出循环的能力。
3.程序中使用了寄存器ACC、B、R0、R7,以及PSW,占用硬件资源最少。
4.程序结构简单,运行时,花费的时间最短。
5.文字标注清晰明确,便于理解和修改程序。
修改时,只需改动开始的两行,即可修改参加排序数据的个数和起始地址。
另外,把 S3: JC S4,改为 JNC,即成为递减排序。
大家可以看看其它类似的排序程序,肯定找不到比做而论道编写的更简单高效的了。
;=====================================================
1.对8个数据进行递增排序;
2.需要排序的数据存在内部数据存储器30H-37H地址单元中,分别为 34H,56H,23H,90H,32H,68H,09H,75H;
3.排序后数据存在内部数据存储器30H-37H地址单元中。
悬赏分:20 | 解决时间:2011-9-24 10:06 |
最佳答案:
;-----------------------------------------------------
ORG 0000H
MOV 30H, #34H
MOV 31H, #56H
MOV 32H, #23H
MOV 33H, #90H
MOV 34H, #32H
MOV 35H, #68H
MOV 36H, #09H
MOV 37H, #75H
CALL SORT
SJMP $
;-----------------------------------------------------
SORT: ;最简短、高效的排序程序.
MOV B, #7 ;第一轮排序时,比较7次.
S1: MOV R0, #30H ;数据区的起始地址.
CLR PSW.5 ;清除"交换"标志位.
MOV R7, B
S2: MOV A, @R0 ;取前一个数.
INC R0
CLR C
SUBB A, @R0 ;减后一个数,前<后时,Cy=1
S3: JC S4 ;有借位时,不用交换,转移.
MOV A, @R0 ;取后一个数,准备交换.
DEC R0
XCH A, @R0 ;交换到前一个.
INC R0
XCH A, @R0 ;交换到后一个.
SETB PSW.5 ;设定"交换"标志位.
S4: DJNZ R7, S2 ;继续本轮比较.
JNB PSW.5, ENDS ;如本轮没有进行过交换,可提前结束.
DJNZ B, S1 ;下一轮,比较次数少一次.
ENDS: RET
;-----------------------------------------------------
END
;=====================================================
回答时间:2011-9-23 20:27
回答者:做而论道 | 十五级 采纳率:43%
原题网址:http://zhidao.baidu.com/question/322526862.html
;=====================================================
后记:
这个排序程序,是做而论道经过多年的精心研究编写出来的,在各种书籍、网文中,从没有与此相同的程序。
本程序有如下一些特点:
1.使用了“冒泡法”。
2.可检测序列是否已经排好,具有提前退出循环的能力。
3.程序中使用了寄存器ACC、B、R0、R7,以及PSW,占用硬件资源最少。
4.程序结构简单,运行时,花费的时间最短。
5.文字标注清晰明确,便于理解和修改程序。
修改时,只需改动开始的两行,即可修改参加排序数据的个数和起始地址。
另外,把 S3: JC S4,改为 JNC,即成为递减排序。
大家可以看看其它类似的排序程序,肯定找不到比做而论道编写的更简单高效的了。
;=====================================================
相关文章推荐