不插电的计算机科学
  • Introduction
  • 前言
  • 特别鸣谢
  • 第一部分 - 数据:最原始的材料
    • 活动1 - 计算“点”-二进制数
      • 素材:二进制数
      • 二进制数
      • 活动学习单1: 二进制数
      • 活动学习单2: 使用二进制表示数字
      • 活动学习单3: 传送秘密信息
      • 活动学习单4: 电子邮件与数据机
      • 活动学习单5: 数到31以上
      • 活动学习单6: 更多关于二进制数的知识
      • 这个活动在说什么?
      • 答案和提示
    • 活动2 - 用数字表示颜色 — 图像展示
      • 用数字表示颜色1
      • 用数字表示颜色2
      • 活动学习单1: 儿童传真
      • 活动学习单2.1: 做出自己的图片
      • 活动学习单2.2: 做出自己的图片
      • 这个活动在说什么?
      • 答案和提示
    • 活动3 - “你说什么?” - 文字压缩
      • “你说什么?”
      • 活动学习单1:“你说什么?”
      • 这个活动在说什么?
    • 活动4 - 翻转卡片魔术 - 错误的检测和修正
      • 魔术般的技巧
      • 一个现实的范例:书码与条码
      • 这个活动在说什么?
    • 活动5 - 二十个问题 - 信息理论
      • 二十个问题
      • 活动:二十个问题
      • 活动学习单1: 决策树
      • 这个活动在说什么?
      • 答案和提示
  • 第二部分 - 让计算机运行:算法
    • 活动6 - 海战棋:搜索算法
      • 海战棋活动 — 暖身
      • 线性搜索游戏
      • 二元搜索游戏
      • 哈希法搜索
      • 延伸活动
      • 这个活动在说什么?
    • 活动7 — 从最重到最轻:排序算法
      • 最重与最轻
      • 学习活动单:重量的排序
      • 学习活动单:分治法(Divide and Conquer)
      • 这个活动在说什么?
      • 答案和提示
    • 活动8 — 与时间赛跑:排序网络
      • 排序网络
      • 这个活动在说什么?
Powered by GitBook
On this page
  • 快速排序法(Quicksort)
  • 活动变化与延伸
  1. 第二部分 - 让计算机运行:算法
  2. 活动7 — 从最重到最轻:排序算法

学习活动单:分治法(Divide and Conquer)

Previous学习活动单:重量的排序Next这个活动在说什么?

Last updated 7 years ago

快速排序法(Quicksort)

快速排序法比选择排序法还要迅速,对于大型的表单则更加明显。事实上,这是目前最好的排序方法之一。以下是快速排序法执行的方法。

从全部的物件中随机挑选出一个物件,然后把它放在天平的一端。

然后将它与其他剩余的物件——比较,将较轻的放在左侧,随机选出的物件放在中间,较重的则放在右侧。(有可能在结束时,两边物件的数量不一样)

选择其中一侧,将该侧所有物件重复上面的步骤。再将另一侧的物件也做一样的处理。

记得记住一开始选择的物件要保持在中间。

在剩余的物件里一直重复这些步骤,直到每一组都只剩一个物件。一旦所有物件组都只剩一个物件,所有物件便会被分成由最轻到最重的顺序。

整个过程需要比较几次?

我们可以发现,快速排序法比选择排序法更有效率,除非你一开始就选择到最轻或者最重的那个物件。如果你够幸运,一开始就选到中间的重量,相较于需要28次才能完成的选择排序法,快速排序法能以14次比较来完成排序。在任何情况下,快速排序法都不会比选择排序法差,甚至更快速!

高手挑战:假如快速排序法意外的一直选到最轻的物件,则需要几次比较来获得结果?

活动变化与延伸

排序还有很多种不同的方法,你还可以用以下这些方法来试着把重量排序:

插入排序法是从尚未排序的物件群中挑出一个物件,把它插入已排序物件群中正确的位置(见下图)。随着一次次的“挑出物件->插入已排序物件群”,未排序物件群的规模越来越小,而已排序物件群的规模越来越大,直到所有物件都排序完成。我们玩扑克牌时就常常利用这个方法来理牌。

冒泡排序法是一次又一次从头到尾检查整个物件群,如果两个相邻的物件顺序不对就把它们交换,整个物件群检查完之后,再重头开始检查一次。如果没有任何物件在检查名单时被交换,就表示排序完成了。这个方法并不是很有效率,但是对某些人来说这种方法较容易理解。

合并排序法是另一种利用“分治法”来排序物件的方法。首先,将名单随机分成大小相同的两个物组(总数为奇数个时,则分成大小相近的两份)。两个物组都要分别做排序,最后再将两个物组合并。合并两个群组的做法相当容易——比较两个群组最轻的物件,把较轻的那个跳出来放入排序群组中。在下图中,两组的最前面的物件分别是40和60克,所以下一个就把40克的物件挑出来放入已排序群组中。那么,最开始分成两个群组以后,要怎么分别排序呢?简单——用合并排序法!最后,所有的群组会被分成只剩下一个物件,所以你不需要担心永远分不完。