所有的时间

80多种分类算法



从Google驱动器下载AlgoLab( AlgoLab(Excel 2007-2013).xlsmAlgoLab(Excel 97-2003).xls文件 )。

布尔什维克主义者一直在谈论的东西和我多年来一直以不同的步伐追求的东西终于发生了。 几年前,他写了一个小宏来创建用于habrastaty的算法gif动画。 随着时间的流逝,我不起眼的乐器已经成长为令人印象深刻的尺寸,这对于现在向世界展示并不是什么遗憾。

见面吧

AlgoLab是一个Excel应用程序(即带有宏的Excel文件),您可以在其中逐步了解排序算法。 并且也有机会准备gif动画。

生成动画的示例

二叉树排序




意大利面分类




睡觉排序





只有4张纸-2张主纸和2张主纸,仅供参考。 它们是:
排序表工艺表
排序表图纸图
点击图片将打开全尺寸图片

  • 排序表。 在此工作表上,您可以快速形成阵列并选择排序算法。
  • 工作表过程。 在这里,我们逐步观察这种算法的工作方式。
  • 排序表。 这是算法的摘要。
  • 工作表图。 对于分类的文章,也有计划的发布时间表。

让我们更详细地了解这些工作表。

排序表


工作表的上部专门用于生成未排序的数组(以便有一些东西可以填充算法),以及将可视化形式以图像形式保存在计算机上:



第一行是数组本身。 如有必要,您可以手动更改其中各个元素的值:



在左上角,您需要为生成的数组指定主要特征:


大小,即数组中的值是否应为非重复的(0-否,1-是),该值等于数组中的最小和最大元素。 VBA宏对输入数据具有破坏性,因此您可以输入一些不正确的值。 在这种情况下,应用程序将确定此特性或该特性应等于什么。

还有一个选项,用于确定是否有必要逐步执行算法(= 1),或者是否有可能对结构进行排序并仅显示最终结果(= 0)。 当然,创建excel应用程序本身是为了逐步观察整个过程,因此此处的值通常等于1。 但是有时候在测试时,我会取消此选项,只是检查添加到AlgoLab.xlsm的新算法是否完全有效(也就是说,我首先需要查看排序后的数组是否为最终结果,而不会浪费时间查看可视化效果)

右边的区域是您可以在其中指定未排序的数组中元素的精确排序方式的区域。


生成随机混合数组? 还是按降序排列元素? 还是使数组几乎排序(并指定几乎排序的系数)?

要选择这些方法中的任何一种,您只需单击带有该项的单元格。 结果,该数组在第一行中重新生成。 所选单元格将变为蓝色。

如果您不仅需要欣赏可视化效果,而且还需要将整个过程逐帧保存为图像,则在左侧是需要的区域。


首先,您需要指定是否将排序步骤一般导出到图像(= 0,如果不是,则导出= 1,如果是,则= 1,并且此选项为“一次性”,即,排序完成后将其重置为零)。 其次,您需要指定图像格式(只能使用4个选项:GIF,JPG,PNG和BMP。最后一个选项可提供最高质量的结果,因此我建议使用)。 第三,您需要指定保存图像的文件夹的路径(单击此单元格,将打开一个对话框以选择目录)。 然后是宏本身填充的单元格-会话标识符(需要子文件夹的唯一名称来保存此特定排序应用程序的框架)。 并且还必须正确指定捕获区域(左上和右下单元格的坐标,这将是仅限于它们的框架-不复制整张纸吗?)


好吧,在最右边的部分中,您将找到“排序”单元格(它用作启动过程的按钮,在选择排序和生成数组时,只需单击它即可)。

即使在此按钮旁边,还可以放置可在可视化中使用的各种特殊字符。 这些单元不需要被触摸。

在最底层,最重要的是算法的选择。 您只需要单击排序的名称,此后带有它的单元格将变为蓝色。



在80多种算法中,目前大约有一半可用。 到目前为止,未实现的与已实现的相比显得面色苍白。 我仍然没有设法做一些(甚至还没有开始实施)。 一些正在开发中。 其中一些已经过编写和测试,并且很快就会面世(特别是几乎所有通过插入进行的排序都已为我准备好了,但是,我将在接下来的几周内在这些排序上发布habrastats并将它们添加到应用程序中,并共享更新的AlgoLab.xlsm-以及该怎么做,我不想破坏我的系列的新剧集。

我计划修改一些已经实现的排序。 可视化并不能使我满意。


但是在该区域中,选择算法时会加载有关它的摘要信息。 信息从“排序”工作表中获取,并通过宏自动撤消。 顺便说一句,如果您更改此区域中的文本,则在原始工作表上它也会更改。

排序,如您所见。 为了不引起所有这些混乱,根据使用哪种基本的组织数据方法,将它们分为几类。 这些是什么课程?

  • 随机排序。 数组的元素是随机混合的,并且一直持续到结构突然被排序为止。
  • 排序交流。 组织了数组元素的整体成对比较(和交换)。
  • 排序插入。 选择元素,并将每个元素插入其位置。
  • 按选择排序。 在子数组中,选择了最大元素,该元素将插入子数组的末尾。 然后,对其余未分类的部分重复相同的过程。
  • 合并排序。 搜索彼此连接的有序子数组。
  • 按分布排序。 将元素划分为多个类,直到获得所需的结果。
  • 混合排序。 交换,插入,选择,合并和分发算法的方法被组合在一起。
  • 并行排序。 提供对数组不同部分进行并行处理的算法。
  • 排序网络。 数组通过排序网络传递;在输出处进行排序。
  • 其他排序。 伪算法,漫画和简单的奢侈排序。


在即将到来的骚扰中,将突出显示每个班级的细微差别。 好吧,我们继续下一页。

工艺表


实际上,当生成一个数组,选择一种算法并单击“排序”按钮时,宏将抛出该工作表。 正是在这里发生了组织数据的奥秘。



在上面的整个过程中,您将看到一个美妙的窗口:



由于观看模式是逐步的,因此为了进行下一步,必须在其中按下“新步骤”按钮 。 用鼠标执行此操作不是很方便,因此窗口输入的焦点始终在此按钮上。 也就是说,继续进行下一步,您只需要懒惰地按Enter键盘即可(不需要其他手势)。

“完成”按钮从分步视图显示过程。 该算法将以静默方式完成其工作,并仅显示最终结果。 您将看不到排序操作的最后阶段。

“取消”按钮在这一步完全停止了宏的工作。

“快照”按钮允许您保存此特定步骤的屏幕快照。 然后,您将在排序表上的设置中指定的文件夹中找到图片。

排序表


一个巨大的表,其中包含有关排序的各种知识。 您还记得,在排序表上选择排序时,信息是从此处提取的。 我悔改了,尽管填充质量很一般,但是没有足够的毅力来认真介绍最大数量的正确数据。 希望在不久的将来能赶上。

图纸图


在此工作表上,您可以了解我对最近的止血剂释放日期的幻想。



我将按顺序讨论算法。

交换→插入→选择→合并→分配→
→混合→并行→网络→随机

列出了普通班,但总的来说,每个班级都会有一些服从这种普通方案的意见。

  1. 排序类的描述。 所有基本类别固有的入门,基本的细微差别。 通常,这些介绍性文章将包含相当知名的信息。 但是,我会尽量不要感到无聊。
  2. 一些鲜为人知的类排序。 在这里,我将为您提供新的材料,其中几乎没有俄文的信息。 而且即使是英语,您也找不到任何东西。 单独的文章不仅涉及交换排序,因为长期以来没有时间进行有趣的排他性讨论。
  3. 各个类别之间的实际比较。 对于每组算法,都会有一篇最后的文章专门讨论对不同数据集的排序。 在这里,我承诺会有很多惊人的发现!


实用排序比较


计划仅比较算法的python实现。 但是,在看到gnome排序示例的第一个结果之后,我得出的结论是,它们将对相对速度产生误解。

Python有其自己的访问变量内存的系统(尤其是如果这些变量相互分配),这就是为什么优化算法运行速度较慢的原因。

矮人排序优化的矮人分类
def gnome(data): i, size = 1, len(data) while i < size: if data[i - 1] <= data[i]: i += 1 else: data[i - 1], data[i] = data[i], data[i - 1] if i > 1: i -= 1 return data 
 def gnome_opt(data): i, j, size = 1, 2, len(data) while i < size: if data[i - 1] <= data[i]: i, j = j, j + 1 else: data[i - 1], data[i] = data[i], data[i - 1] i -= 1 if i == 0: i, j = j, j + 1 return data 
10个数组,每个数组1000个元素
总时间: 3.39134秒。总时间: 5.6809秒。


摇床/泡泡类似的情况。 与预期相反,气泡分选比振动筛分选更快(尽管“摇床分选”是一种改进的气泡分选)。

为了控制,我也用PHP测试了排序(我主要使用这种语言工作,因此替代测试更快速,更容易在其上创建)。 那里的情况已经“正常”-所有数据集上的优化“ gnome”运行速度显然都比正常快。

但是,PHP也因其“不完美”和缓慢的工具而闻名,因此我认为它也不适合全局结论。 为了最大程度地减少麻烦(选择错误的语言来测试实际速度),我决定也最小化Java中的主要测试。 但是,我对这种语言缺乏了解。 las,它并没有一起成长。

因此,将立即以三种三种语言进行测试:

  • 巨蟒 首先,这种语言最适合描述算法。 由于存在正确的功能,因此我们将评估它们的时间。 但是结果将有些可疑。
  • 的PHP 最初,我不会在任何系列文章中以任何方式使用这种语言。 但是由于我在上面编写了一个用于测试排序的环境,并且该PL上的实现本身可用,所以为什么不这样做。 与Python相比,可以判断算法的相对有效性的实际结果更为充分。
  • 爪哇 基于Java的结果,我们将得出主要结论。


当然,所有语言的所有选项都将被共享。

常见问题


我已经预见到观众会提出一些问题,我会立即回答。

为什么要在Excel中实现用于可视化算法的程序?


因此一次(对我而言)它变得更快,更容易。 电子表格的晶格空间原来是一个非常方便的交钥匙解决方案,用于可视化数组工作。

好吧,让我们看看所有这些种类。 接下来是什么?


基于AlgoLab,我将对树木,图形进行可视化。 乌兰的桌布,兰顿的蚂蚁,仅此而已。 仍然有2048的空白(AI播放使用minimax和Monte Carlo方法-您需要完成它)。 作品是很多土地。

参考文献


从Google驱动器下载AlgoLab( AlgoLab(Excel 2007-2013).xlsmAlgoLab(Excel 97-2003).xls文件 )。

系列文章


Source: https://habr.com/ru/post/zh-CN414447/


All Articles