最简短且高效的排序程序
扫描二维码
随时随地手机看文章
要求使用MCS-51单片机,进行数据排序。
1.对8个数据进行递增排序;
2.需要排序的数据存在内部数据存储器30H-37H地址单元中,分别为34H,56H,23H,90H,32H,68H,09H,75H;
3.排序后数据存在内部数据存储器30H-37H地址单元中。
最佳答案:
;-----------------------------------------------------
ORG0000H
MOV30H,#34H
MOV31H,#56H
MOV32H,#23H
MOV33H,#90H
MOV34H,#32H
MOV35H,#68H
MOV36H,#09H
MOV37H,#75H
CALLSORT
SJMP$
;-----------------------------------------------------
SORT:;最简短、高效的排序程序.
MOVB,#7;第一轮排序时,比较7次.
S1:MOVR0,#30H;数据区的起始地址.
CLRPSW.5;清除"交换"标志位.
MOVR7,B
S2:MOVA,@R0;取前一个数.
INCR0
CLRC
SUBBA,@R0;减后一个数,前<后时,Cy=1
S3:JCS4;有借位时,不用交换,转移.
MOVA,@R0;取后一个数,准备交换.
DECR0
XCHA,@R0;交换到前一个.
INCR0
XCHA,@R0;交换到后一个.
SETBPSW.5;设定"交换"标志位.
S4:DJNZR7,S2;继续本轮比较.
JNBPSW.5,ENDS;如本轮没有进行过交换,可提前结束.
DJNZB,S1;下一轮,比较次数少一次.
ENDS:RET
;-----------------------------------------------------
END
;=====================================================
;=====================================================
后记:
这个排序程序,是做而论道经过多年的精心研究编写出来的,在各种书籍、网文中,从没有与此相同的程序。
本程序有如下一些特点:
1.使用了“冒泡法”。
2.可检测序列是否已经排好,具有提前退出循环的能力。
3.程序中使用了寄存器ACC、B、R0、R7,以及PSW,占用硬件资源最少。
4.程序结构简单,运行时,花费的时间最短。
5.文字标注清晰明确,便于理解和修改程序。
修改时,只需改动开始的两行,即可修改参加排序数据的个数和起始地址。
另外,把S3:JCS4,改为JNC,即成为递减排序。
大家可以看看其它类似的排序程序,肯定找不到比做而论道编写的更简单高效的了。
;=====================================================