vlambda博客
学习文章列表

【记录学博图】—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 TODO  //内部小循环,找出当前的最大,最小值

                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块,即可像视频中一样执行排序

备注:循环时需要注意数组的长度,避免超出数组下标范围。


参考:网络资料,计算机排序算法。