[西门子] 西门子冒泡排序获取最大值和最小值

[复制链接]
查看163 | 回复0 | 2025-4-13 19:57:50 | 显示全部楼层 |阅读模式
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。这个过程会持续进行直到没有需要交换的元素为止,这意味着该数列已经排序完成。一、获取最大值和最小值
  • 获取最大值:在冒泡排序中,每一轮遍历都会将当前未排序部分的最大值“冒泡”到其正确的位置(通常是数组的末尾)。因此,在完成第一轮遍历时,就可以得到整个数列的最大值。

  • 获取最小值:类似地,如果我们对一个数组进行从大到小的冒泡排序,那么第一轮遍历之后就能找到整个数列中的最小值。

二、主要应用场合

尽管冒泡排序不是最有效的大规模数据排序算法,但在某些特定情况下,它还是有其用武之地:

  1. 教学与学习
    由于其实现简单直观,非常适合用来教授基本的排序概念和算法原理。
  2. 小型数据集
    对于非常小的数据集或几乎已经排序好的列表,冒泡排序可能就足够了,并且实现起来比较简单。
  3. 检测少量错误
    如果列表已经接近有序,冒泡排序可以快速发现并纠正少数位置不对的元素。

三、意义

  • 教育意义
    作为一种入门级的排序算法,有助于初学者理解排序的基本概念和算法的工作原理。
  • 实际应用有限
    虽然冒泡排序在实际应用中的效率不高,特别是对于大数据集时性能较差,但它提供了一个很好的基础,帮助人们理解和开发更高效的排序算法。
  • 简单性
    由于其实现简单,对于一些对性能要求不高的场景,或者作为更大系统中的一个组件时,冒泡排序仍然有一定的使用价值。
四、FB块封装

//In1--In9 参与排序的Input数据,MOVE到A_Real[0--9]数据中; 

#A_Real[1] := #In_1;

#A_Real[2] := #In_2;

#A_Real[3] := #In_3;

#A_Real[4] := #In_4;

#A_Real[5] := #In_8;

#A_Real[6] := #In_6;

#A_Real[7] := #In_7;

#A_Real[8] := #In_8;

#A_Real[9] := #In_9;

//复制输入数据A_Real[],到临时地址B_Real[] 

//Number是参与数据排序个数,填入对应数字(此处是9个数据参与排序,因此填入9)

IF #触发排序 THEN

    FOR #iii := 1 TO #参与数据排序个数 BY 1 DO

        #B_Real[#iii] := #A_Real[#iii];

        #Num[#iii] := #iii;

    END_FOR;

END_IF;

//开始冒泡法排序

IF #触发排序 THEN

    FOR #i := 1 TO #参与数据排序个数 - 1 BY 1 DO

        FOR #j := 1 TO #参与数据排序个数 - #i BY 1 DO

            //Mode为排序模式(Mode=0降序排列,mode=1升序排列)

            IF #"升序/降序" THEN                        //Mode为排序模式,mode=1升序排列

                IF #B_Real[#j] > #B_Real[#j + 1] THEN

                    #Temp := #B_Real[#j];

                    #B_Real[#j] := #B_Real[#j + 1];

                    #B_Real[#j + 1] := #Temp;           //B_Real[1--9]中数据为升序排列

                    #Temp2 := #Num[#j + 1];

                    #Num[#j + 1] := #Num[#j];

                    #Num[#j] := #Temp2;

                END_IF;

            ELSE                                 //Mode为排序模式;Mode=0降序排列;

                IF #B_Real[#j] < #B_Real[#j + 1] THEN

                    #Temp := #B_Real[#j];

                    #B_Real[#j] := #B_Real[#j + 1];

                    #B_Real[#j + 1] := #Temp;           //B_Real[1--9]中数据为降序排列

                    #Temp2 := #Num[#j + 1];

                    #Num[#j + 1] := #Num[#j];

                    #Num[#j] := #Temp2;

                END_IF;

            END_IF;

        END_FOR;

    END_FOR;

    #触发排序 := 0;

    #Temp := 0;

    #i := 0;

    #j := 0;

    IF #"升序/降序" THEN

        #最大值编号 := #Num[#参与数据排序个数];      //Mode=1时,最大数据对应标签编号;

        #最小值编号 := #Num[1];           //Mode=1时,最小数据对应标签编号;

        #最大值 := #B_Real[#参与数据排序个数];   //Mode=1时,最大数据数值;

        #最小值 := #B_Real[1];        //Mode=1时,最小数据数值;

    ELSE

        #最大值编号 := #Num[1];           //Mode=0时,最大数据对应标签编号;

        #最小值编号 := #Num[#参与数据排序个数];      //Mode=0时,最小数据对应标签编号;

        #最大值 := #B_Real[1];        //Mode=0时,最大数据数值;

        #最小值 := #B_Real[#参与数据排序个数];   //Mode=0时,最小数据数值;

    END_IF;

END_IF;

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则