关于“冒泡法”排序程序的逆向思考。

已锁定

n次看你的背影

  • 帖子

    2321
  • 精华

    73
  • 被关注

    53

论坛等级:奇侠

注册时间:2008-03-11

普通 普通 如何晋级?

关于“冒泡法”排序程序的逆向思考。

9975

22

2012-07-28 20:51:17

star star
在一些资料上看到,“冒泡法”排序一般是从最后一个数据开始,向地址小的方向相邻两个数据比较,并按照从小到大或者从大到小排序的一种算法。在数据比较、移动的过程中,数据的运动,看起来好像水中的气泡向上运动。故而称之为“冒泡法”排序。

“冒泡法”排序,在知道数据的起始地址、数据个数、数据类型后,需要算出最后一个数据的地址,并从最后的一个地址开始运算排序。我在想,为什么不能从数据的起始地址开始排序呢,如果采用这种“下沉法”排序,还能省去计算数据的结束地址,程序应该会更简洁。于是自己就试着写了一下“下沉法”排序的代码,并测试通过。

排序环境:224CPU,从VB1000开始连续20个整数,从小到大排序。“下沉法”排序算法参考代码如下:

//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬给外循环体、内循环体的循环次数赋初值╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
LD SM0.0 //开始执行从小到大的排序程序
MOVW 19, LW2 //给外循环次数(数据个数-1)赋初值
MOVW 19, LW6 //给内循环次数(数据个数-1)赋初值
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬建立外循环体并定义排序的其实地址╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
FOR LW0, +1, LW2 //FOR外循环体循执行LW2次
MOVD &VB1000, AC1 //将V区的起始地址赋给AC1,定义排序的起始地址
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬建立内循环体并开始进行相邻的两个数据比较、移动╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
FOR LW4, +1, LW6 //FOR内循环体循执行LW6次
MOVD AC1, AC2 //把当前AC1里面的地址存储到AC2里面
+D +2, AC2 //AC2当前地址+2,存入AC2
LDW< *AC2, *AC1 //如果AC2指向的地址里面的内容小于AC1指向的地址里面的内容
MOVW *AC1, LW8 //那么将当前两个地址里面的内容互换
MOVW *AC2, LW10 //如果AC2指向的地址里面的内容不小于AC1指向的地址里面的内容
MOVW LW8, *AC2 //那么当前两个地址里面的内容保持不变
MOVW LW10, *AC1 //★如果把小于比较指令改成大于比较指令,那么数据就是从大到小排序
LD SM0.0
+D +2, AC1 //AC1当前地址+2,存入AC1
NEXT //跳转到FOR内循环,如果内循环执行结束,程序往下执行
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬内循环执行结束,进入外循环执行╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
DECW LW6 //★内循环体执行结束,将内循环体的循环次数减1
NEXT //跳转到FOR外循环,如果外循环执行结束,程序往下执行


上面代码基本采用临时变量作运算的,有兴趣的朋友,还可以将其封装成一个子程序,可以实现多次调用。
关于“冒泡法”排序程序的逆向思考。 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200

共有33257条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。