大数跨境
0
0

LEGO Mindstorms 阵列运算模块-排序算法

LEGO Mindstorms 阵列运算模块-排序算法 FaceFuture机器人竞赛TSC
2019-11-10
1
导读:临近双十一,相信大家在疯狂淘宝的过程中一定见过按价格排序的选项,那价格是如何排序的呢?我们能否通过EV3进行编程完成数字的排序呢?请文中观瞧……


     临近双十一,相信大家在疯狂淘宝的过程中一定注意到这么一个按钮

    那价格是如何排序的呢?我们能否通过EV3进行数字的排序呢?最近整理了一下使用EV3完成的各种排序方法,后续也会继续更新,此篇幅作为先行章,详细讲一下索引排序法。

01


      在排序时,若是数据很复杂,对数据的移动显然是费时的。若把数据移动改为索引移动,则减少了操作复杂度。计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。


02


      我们的任务为将随机生成的5个数字进行索引排序,我们先来详细看一看数组中元素重复只需要显示一次的情况。

    往随机数对应的索引位置写入1,写完之后进行数组遍历,将组合数组内的数值和1进行比较,等于1时显示该数值对应的索引,遍历一次就能完成排序。
    从索引0开始遍历,完成从小到大排序,从最大索引(长度减1)开始遍历,则完成从大到小排序,这样的方法出现重复数值时,排序过程中只会显示一次。


第一部分程序:

我们先解决编程前遇到的各种问题
    如何生成随机数作为索引?
-随机模块
(需要明确的是,随机生成的数字要作为索引,并且记录为1其他索引位的值为0)。
    显示的数字的位置如何排列?
-将循环索引的值存入一个数字变量中,因为5个随机数要在5次循环中依此显示,使用循环索引,逐渐扩大y轴的坐标,使得5个数字在一排有序排列。


程序解读:清除屏幕,循环索引存入n1,往数组A中随机数对应的位置存入1(其余位置默认为0)并通过变量n1将随机数依次显示在屏幕上,重复执行5次。


第二部分程序:

循环体循环的次数与什么有关?
-数组的长度。
依此读取索引值的是什么?
-统计值为1的索引值并显示。
重新排列过的数组的显示位置。
-增大y坐标的值,不能与第一部分程序的显示的数字重合。

程序解读:循环索引存入变量sy中,依次读取数组A中的数值和1进行比较,等于1则将其显示在屏幕上,并将变量n加1,读取数组A长度控制循环次数,循环外加个等待即可。
变量n的功能是控制排序过程中的数值的显示位置,同时它也统计了遍历过程中数值为1的数值个数,它的最大值为5,循环也可在n等于5时结束。
这种情况下,随机数的最大值为数组的长度减1,随机数的最小值为第一个等于1处的索引值。

效果展示:由于取值范围较大,多次试验后并未出现重复的数字。


03


拓展:将0到200之间的五个随机数从大到小排序

从数组末尾开始进行数值比较就能变为从大到小排序
程序修改如下:

    数组长度减1得到最大索引,循环索引从0开始变化,做减法运算之后,得到的索引值是从大到小变化。
        那么数组中元素出现重复需要重复显示的情况我们怎么处理呢?
来看下面这个动图

根据动图的提示,各位自己试一试。

04

整理写程序,解决困难的过程:

任务→关键词→关键模块→编写→调试→修改→成功

解决不了的难点→逐步转化→可解决的问题→解决后组合

    在我们学习完索引排序的方法之后,对于初学者来说,将问题简化是很重要的,我们将难题分解,分解成一个个容易解决的小问题后,结合EV3模块化的编程平台,很容易找到突破口,再经过反复调试,就能成功。


在程序中不要被“一眼解决不了的问题”吓倒,
仔细想想它总能转化成“没什么大不了的问题。
 就像无论多复杂的程序在计算机看来也都只是0与1的影子。







【声明】内容源于网络
0
0
FaceFuture机器人竞赛TSC
FaceFuture是一间关于机器人和创客的小型工作室,在这里我们激发想法,拥抱所有类型的创造。希望我们每个人都能在这里成为终身学习者,我们通过机器人竞赛和交流活动将这种精神传递给每一个真正热爱机器人与制造的人。
内容 36
粉丝 0
FaceFuture机器人竞赛TSC FaceFuture是一间关于机器人和创客的小型工作室,在这里我们激发想法,拥抱所有类型的创造。希望我们每个人都能在这里成为终身学习者,我们通过机器人竞赛和交流活动将这种精神传递给每一个真正热爱机器人与制造的人。
总阅读0
粉丝0
内容36