【记录学博图】—SCL排序之选择排序法
前面记录了冒泡排序法,今天记录一下选择排序法。
选择排序也是比较简单的一种方法,同样使用交换来完成,我感觉比冒泡排序法更加好理解,交换的次数变少了。
在上次的基础上,将FC块的接口增加两个变量
select:选择排序开关
index:记录数据当前位置
编写如下格式的代码
源代码如下
REGION 选择排序法
(*
排序步骤
1,从数组中找出最大/最小数,和第一个位置的数据交换
2,从剩下的数中再找出最大/最小数,和第2个位置的数据交换
3,重复步骤2,直到最后完成
实例数据: 18 1 5 27 12 从大到小排序
第一轮排序 27 1 5 18 12
第二轮排序 27 18 5 1 12
第三轮排序 27 18 12 1 5
第四轮排序 27 18 12 5 1
第五轮排序 27 18 12 5 1
*)
#tempArray := #date; //接收需要排序的数据
IF #select THEN //排序在使能下运行
FOR #i := 0 TO 4 DO //外部大循环,执行多次轮判断
#index := #i;
FOR #j := #i+1 TO 4 DO //内部小循环,找出当前的最大,最小值
IF #"up-dowm" THEN
IF #tempArray[#j] > #tempArray[#index] THEN //从大到小
#index := #j;
END_IF;
ELSE
IF #tempArray[#j] < #tempArray[#index] THEN //从小到大
#index := #j;
END_IF;
END_IF;
END_FOR;
#tempDate := #tempArray[#i]; //交换两个相邻数据
#tempArray[#i] := #tempArray[#index];
#tempArray[#index] := #tempDate;
END_FOR;
#outDate := #tempArray; //输出排序完成的数据
#select := FALSE; //复位排序使能信号
END_IF;
END_REGION
在Main[OB1]中调用该FC块,即可像视频中一样执行排序
备注:循环时需要注意数组的长度,避免超出数组下标范围。
参考:网络资料,计算机排序算法。