使用SCL语言实现一个冒泡排序的简单算法

 


前言

本文我们来一起使用SCL来实现一个简单的算法——冒泡排序;它可以对少量数据进行从小到大或从大到小排序;另外它也是一种比较简单容易理解的一种排序方法。


一、冒泡排序

下面是在360摘抄的冒泡排序的含义和原理:





 

二、实现排序

 这里我们在博图中建立编写环境然后创建数组和变量;这里我们可以直接定义一个起始值,然后排序;也可以输入相应的值,然后再排序;

1.读取存储器地址(PEEK)指令

我们建立两个数组,一个存放初始值,一个存放排序值;这里我们想要在初始数组里面输入数值,在排序数组里面显示排序后的值 ;我们要用到scl中的读取存储器地址指令来完成;

第1个参数是选择读取哪一个区的地址,其中:16#81是输入,16#82是输出,16#83是位存储区  ,16#84是DB数据块  ;

  • 16#81:Input          

  • 16#82:Output    

  • 16#83:位存储区  

  • 16#84:DB              

 第2个参数是DB块的序号,如果是数据块DB1,那么序号就是1,以此类推;

第3个参数是待读取的地址,这里我是用的数据块,所以地址是它的偏移量; 

 


 

2.编写程序

首先获取我们初始数组的数值传到排序数组中;#NP_TEMP 是一个整型变量,主要是用来获取数据块的偏移地址,每次循环+=2是因为是16位,也就是两个字节,对应相应的偏移量;

#NP_TEMP := 0;
FOR #i := 0 TO #len DO
    "数据块_1".排序值[#i] := WORD_TO_INT(PEEK_WORD(area := b#16#84, dbNumber := 1, byteOffset := #NP_TEMP));
    #NP_TEMP := #NP_TEMP + 2;
END_FOR;

 

 这里再使用两个FOR循环,嵌套使用,对数组内的数值进行遍历,如果第一个大于第二个,就将第一个和第二个交换,然后以此类推;

 第2for循环中每次减J是因为循环过一次之后最大的一个已经找到并排在最后了,所以第2次循环只要循环8次就够了,相同的道理,再一次循环之后仅次于最大的数也找到了,所以这里才每次-J;

FOR #j := 0 TO #len-1 DO
    FOR #m := 0 TO #len - 1-#j  DO
        IF "数据块_1".排序值[#m] > "数据块_1".排序值[#m + 1] THEN
            #t := "数据块_1".排序值[#m];
            "数据块_1".排序值[#m] := "数据块_1".排序值[#m + 1];
            "数据块_1".排序值[#m + 1] := #t;
        END_IF;
    END_FOR;
END_FOR;

 效果:

 





总结

以上就是今天的所有内容啦!

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐