在第一次学习排序算法时,应该先教学生什么?

时间:2008-10-17 13:10:23

标签: algorithm sorting

如果您是一名编程老师,您必须选择一种排序算法来教您的学生哪一种?我只要求一个,因为我只想介绍排序的概念。它应该是冒泡排序还是选择排序?我注意到这两个人最常被教授。还有其他类型的排序可以用更容易理解的方式解释排序吗?

33 个答案:

答案 0 :(得分:31)

我不确定自己可以成为一名计算机科学老师,只教一种排序算法。

至少应该向学生讲授major sorting types中的每一个,即交换排序,选择排序,插入排序和合并排序。除了这些类型中的每一种之外,我还将介绍属于分区排序标题的Quicksort

至于我将涵盖的每种类型的具体排序:

  • Bubble Sort作为交换排序类别的一个示例,因为它是最简单的排序类型之一,也是他们可能已经看到或偶然发现的排序类型之一。这也是他们最常使用的那种,如果他们不得不为简单的东西自己动手,那么他们理解它是有意义的。
  • 来自选择排序类别的
  • Heapsort。这可能是Quicksort旁边最混乱的排序,但是一旦他们理解了如何设置它们以理解Quicksort算法。
  • Insertion Sort作为插入排序类别的示例将被涵盖,因为它也是一种简单的排序,它们可以从中获得大量使用。由于他们可能会遇到需要将两个列表合并在一起的情况,因此了解这个列表是有道理的。
  • Merge Sort在某种程度上是一种特殊的排序方式,因此您不会经常看到它,但它非常擅长它的功能,并且在需要对数据进行排序的情况下仍然很有用零碎的时尚。

如果我不得不把事情缩小到我可以教的一种,但我有时间确保学生完全理解发生了什么然后我会教Quicksort。虽然它并不容易掌握,但绝大多数框架都将它用于排序算法,因此了解它的工作方式对于使用该框架进行开发非常有用。此外,很有可能如果有人能够理解Quicksort,那么他们应该能够自己学习冒号排序和插入排序。

答案 1 :(得分:22)

让学生决定。

在介绍任何排序算法之前,给每个学生一些扑克牌,大约10个左右。然后让他们对卡片进行分类。让他们写下他们采取的步骤,这基本上是他们的算法。可能他们会发现插入或选择排序。您还可以要求他们估计如果他们有100张或1000张牌,他们的排序会采取多少步骤,这是大O符号的良好线索。

PS - 有没有人认为他们会发现冒泡排序?

答案 2 :(得分:21)

无论教授什么排序算法,如果学生还没有学习bogosort,他们就会错过,而老师正在失去一种与观众互动的明显方式:)

答案 3 :(得分:14)

如果你想教授排序,那么冒泡排序可能是最容易理解的。如果你想教授排序算法,那么你应该真正教授快速排序,合并,插入甚至可能是heapsort,以便学生能够感受到各种排序方法之间的权衡。

答案 4 :(得分:6)

我首先要显示插入排序。每个人都对一张牌(基本上都是每个人)进行了分类。此外,它没有冒泡性能的糟糕表现。

答案 5 :(得分:5)

我首先学习了Bubble Sort - 我想如果你只做一个,你可能需要做一个O(n ^ 2)算法,因为它们更容易理解。

有许多排序可视化器可以帮助您快速显示比较结果:

答案 6 :(得分:3)

我会建议选择和合并排序的一般排序算法。与他们的朋友相比,两者都相对简单。但如果你只能教一个而人们可以处理它,我会选择Merge Sort。因为合并排序是高效,稳定的,并教授几个重要的概念(合并,分而治之)。

选择排序:
找到最小/最大值并将其放置到位,然后在列表的其余部分再次执行...这非常直观。对我来说,选择比甚至冒泡排序更直观。你可以在很短的时间内教这个。人们实现这一目标会有一种成就感......虽然泡泡和插入可以提早退出,但不会在排序列表上浪费时间。选择可能是最容易做到的。插入可能是最难实施的。

归并:
这将教会如何合并(这很重要,因为通过将两个排序列表合并在一起可以获得大量的加速)以及如何将问题划分为更小的子问题(对于处理分层结构以及也用于快速排序)。 QuickSort虽然速度更快,但却难以理解。你需要两个扫描变量,一个数据透视项目等......合并更直接,合并将对排序以外的事情派上用场(比如将两个记录连接在一起排在一个字段上)....

合并的基本概念很直观。从排序列表中取出较小的项目并将其放在最终列表中。将合并排序问题分开也很直观 mergesort(上半场) mergesort(下半场)
合并(上半场,下半场)

如果你只能教一种并且必须快速完成(或者观众对所有人都不感兴趣),我倾向于选择,因为这更难以选择,可以快速教授。但如果观众更有动力那么我会做Merge,因为它教授了许多其他基本概念。

在效率更高的排序中,这个排序比快速排序和堆排序容易得多。虽然快速排序可能是实践中最快的(只要你有足够的ram)并且堆可能能够对最大的列表进行排序(如果非递归地实现)。

铲斗分类:
我会谈到这一点,因为它也很直观,代表了另一种排序算法。在许多情况下这是合适的,O(n)时间非常有吸引力。

计数排序:
它有它的用途。在某些情况下,这是非常有效的...它也相对容易。

答案 7 :(得分:3)

我认为排序方法是算法的一个很好的例子。但是,当你比较各种方法时,它只是一个很好的例子。如果你只能教一个,我不确定它是否值得。

实际上,我们在某个框架中调用sort方法。因此,如果你不能有效地教授排序算法,那可能不值得花时间。

没有人必须再编写排序方法,但它仍然是算法影响的一个很好的例子。

答案 8 :(得分:3)

选择排序可能是最直接的教学排序算法,也是最容易掌握的。这也是为什么简单的解决方案并不总是最好的一个很好的例子,这可能导致讨论更有趣和更快的排序,如mergesort和quicksort。

答案 9 :(得分:2)

嗯...排序算法实际上是一种直观,具体的方式,可以教授关于Big O符号,优化,常识和计算机科学的一些好的教训,也许是“冒泡排序”+“选择排序”+“合并排序“方法可能有用,用于比较。我认为最直观(在许多情况下效率很高)是选择排序。

答案 10 :(得分:2)

我会教“调用框架”排序。

教导和学习这种方法会很有效。通过实施此类学生,学生将获得高度成功和低错误率。


编辑: 关于我的单一排序类的质量,这个答案有很多批评意见。这些批评适用于这个问题的任何答案,即 - “如果你是一名编程老师,你必须选择一种排序算法来教你的学生一个会是什么?”

答案 11 :(得分:2)

我认为只教一种是瘫痪。请记住Everything Is Fast For Small n,所以在教授排序方面,这不是性能问题,而是理解算法。

我认为介绍应该是引入概念的泡沫排序,但至少引入另一种方式让学生思考其他方法来执行任务。确保他们理解性能和代码复杂性之间的权衡,并且针对不同情况有不同的工具。

答案 12 :(得分:2)

这将是radix sort。因为它非常容易且不明显。这样的事情只需要教。

答案 13 :(得分:1)

我认为选择排序是最容易理解的,IMO将是最好的引入排序。

我认为不教他们至少一个O(nlog(n))排序算法,以及对大O符号的解释是愚蠢的。

答案 14 :(得分:1)

冒泡排序是经典之作,很容易理解它的工作原理。

但除非这是一个非常介绍性的课程,否则它应该包括其他排序算法的概述,因为这是显示算法设计中涉及的折衷的最佳方式,并解释最佳案例与最坏情况与平均行为(两者都有)运行时和内存)。

答案 15 :(得分:1)

如果您想教授排序的概念,那么我相信您必须至少教授两种不同的排序方式 - 否则学生会认为排序只是您教授它们的一种方式。

我认为学生将从学习经典O(n ^ 2)算法中获得最大价值(最好是插入或选择排序,但请冒泡排序,这没有理由成为用于实际应用程序),以及分而治之的O(nlogn)算法,如快速排序或合并排序。

如果您担心这些问题太难以教导您的学生,请查看专为小学生设计的these activities Computer Science Unplugged

答案 16 :(得分:1)

让每个人都带上一副纸牌,并挑出一件西装。 分成两队。 一个人将13张卡片洗牌,然后将它们面朝下放置。 合伙人可以指向两张牌。 另一个拿起它们,看着它们,或者说“按顺序”或“不按顺序” 然后,该伙伴可以告诉他交换它们,并再次将它们放下(面朝下)

合作伙伴的工作是按顺序对牌进行排序(你需要预先定义的牌)。

当帕纳认为他们被分类时,他说“停止”。 另一张牌面朝上,他们检查。

完成后,讨论对每个人都有用的东西。 然后谈谈BUBBLE SORT vs SELECTION sort

然后谈谈QUICK SORT。

让他们用他们的卡片尝试每一个。

答案 17 :(得分:0)

不要忘记Spaghetti sort ...为量子计算做好准备: - )

答案 18 :(得分:0)

从insertSort开始,然后继续使用mergeSort,quickSort和heapSort,避免使用bubbleSort(有大量研究表明,insertSort不是那么难理解/实现,与bubbleSort相比,它有实际用途(在小数组上比在mergesort上更快)。

答案 19 :(得分:0)

我认为30年前制作的电影Sorting Out Sorting仍然是一个很好的教学辅助工具,可以更好地理解排序算法。heres the 12x speed version

答案 20 :(得分:0)

应首先要求他们实施自己的排序算法 - 从头开始​​,不事先参考任何现有算法。这样做会告诉他们排序的方式,而不是告诉他们一个算法,他们不知道它是如何派生出来的。

答案 21 :(得分:0)

如果你最终只能教授 ONE 算法,我认为SelectionSort更容易教(并实施恕我直言)作为BubbleSort。它可能是非常无效的,但是每个人都会得到它的概念,每个拥有一点编程知识的人都可以读取它的代码,并且有一件事使得SelectionSort在所有排序算法中相当独特:它只需要n - 1个交换来获取n的列表条目:-)不仅它不需要超过n - 1交换,它实际上需要n - 1交换。执行的交换次数是100%确定性的,并且在它开始之前就已知。我认为对于任何其他就地排序算法都不是这样(尽管人们可以在评论中自由纠正我。)

否则我投票支持BubbleSort和SelectionSort,这些是最容易理解的,并展示如何轻松排序(这些很简单,学生可能实际上提出这些解决方案,而没有听说过任何排序算法)有时不是很有效。相比之下,我会展示QuickSort和MergeSort,它们是非常好的除法和征服者算法,而且速度也非常快。

我不使用的算法,因为他们的概念更难获得,是ShellSort,RadixSort,HeapSort和BucketSort。它们也很特别(你通常只在排序某种数据时使用它们,或者如果你有一些排序约束)。

你可能会提到ShellSort的小姐妹,InsertionSort(它基本上是一个shell排序,其步长最终达到一个),但只是因为许多QuickSort实现使用InesrtionSort作为后退排序,一旦递归变得太深(或者递归排序的剩余数据集太小了)......但是这里开始变得非常复杂,你不应该太复杂。

答案 22 :(得分:0)

我会避免谈论冒泡排序,因为虽然它起作用,但它在理论上并不优雅。而且,它从未在实践中的任何地方使用过。有很多算法依赖于选择排序(例如,就地合并)或插入排序(比如疯狂的快速入侵),所以这些可能是很好的开始。我个人最喜欢插入排序,因为从教学角度看它是一个金矿。在最坏的情况下,它是O(n ^ 2),在最好的情况下是O(n),因此为讨论最坏情况/最佳情况分析提供了一个很好的测试平台。这是一种就地排序,所以你可以用它来谈论原位排序和非原位排序,你可以通过谈论它所体现的基本思想来概括它。

答案 23 :(得分:0)

我上周和我的孩子做了这件事 我让他想出他们自己的排序算法,并询问用他的方法对一副纸牌进行排序需要多长时间。 然后我向他展示了泡泡排序(最容易向孩子解释)“这是一个泡泡!”并让他再次计算步数。他意识到它更容易,更快。

然后如果你想要你可以教更高级的(Quicksort是最令人惊讶的), 理想情况下,你应该教三个至少不同的(不是相同的变体)

答案 24 :(得分:0)

我会比较和对比o(n平方),如选择排序和o(n log n)排序,如quicksort。

但是,如果他们不是计算机科学的人,并且不一定打算那么只是表现出一种易于理解的选择或泡沫。

答案 25 :(得分:0)

一旦学生学会了解Quick and Heap排序,IntroSort也是一个很好的教学算法。 IntroSort(Introspective排序的缩写)以QuickSort开头,如果递归深度超过基于被排序元素数的对数的级别,则切换到HeapSort。

总的来说,您可以获得最佳的Quick和Heap排序世界以及 O n log n )的最差运行时间。

维基百科上的

IntroSort

答案 26 :(得分:0)

请记住,您的学生可能永远不会自己编码,问题应该确定“学习​​此算法的价值是什么?”而不是“这个算法做什么?”

换句话说,你的学生应该学习各种不同的算法 - 无论是排序,搜索,压缩等都是无关紧要的。

答案 27 :(得分:0)

无论你选择哪种实际算法,我建议你提出两个算法(而不是一个),并解释他们所做的权衡(内存,执行速度等)。

然后你应该把它归结为没有理想的排序算法可以盲目地应用于任何任务。但是,有很好的候选人。在这一点上,向他们展示快速排序和内省排序(作为家庭作业)并考虑你的任务竞争:)

答案 28 :(得分:0)

呃,你应该给他们一个O(n ^ 2)和一个O(n log n)排序。 Bubble和Heap将是我的选择。

答案 29 :(得分:0)

Quicksort绝对是另一种非常易于理解的排序算法,它实现起来很简单。它有就地和amd“out-of-place”版本很有趣。它很快。

对你来说足够快,至少是老人。

答案 30 :(得分:0)

如果我只选择一个,我会教泡泡排序,因为它更容易掌握(我认为)。然而,我从研究各种排序算法中获得的最有价值的东西是,有多种方法可以做到这一点(最终导致我进入Perl,但这是另一个故事),每个都有优点和缺点。因此,学习单一排序算法可能是一种错过整个事物的关键方面的方法。

答案 31 :(得分:0)

对于初学者来说,冒泡排序是最简单的一种,它也是一个很好的例子,说明为什么简单的解决方案可能很昂贵。可能是一个很好的方法来分析渐近复杂度和大O符号?

答案 32 :(得分:0)

我曾参加过最好的算法演示,将所有作为通过java applet绘制的条形图。然后,您可以看到排序模式以及O(N)特征......

教泡沫,因为它非常简单并且可以将其余部分显示为动画吗?