Ted talk · Section 7
如何高效地整理书架
你是一名大学图书馆的管理员, 正在享受午后的闲暇时光。
Level: HSK5 · 77 sentences
Transcript
- 你是一名大学图书馆的管理员,
- 正在享受午后的闲暇时光。
- 这时快递突然送来了1280本各式各样的书。
- 这些书被排成长长的一排,
- 毫无规律,
- 自动分类系统又恰好出现了故障。
- 更糟糕的是,明天一早,
- 前来上课的学生们,
- 就会涌入图书馆借书。
- 如何才能在规定的时间内 整理好所有书籍?
- 一种方法是 从最前面的两本书开始。
- 如果这两本书位置正确 则不做任何改动,
- 否则,将它们对换。
- 然后再看第二本书和第三本书,
- 重复这个操作,
- 直到你排列至最后一本书。
- 当你遇到应该位于末位的那本书,
- 那么只需要将它不断地与后一本书交换,
- 直至到达队伍末尾。
- 然后,再从头开始,
- 就可以找出倒数第二本书。
- 如此循环,直到将所有的书归位。
- 这个方法被称为 “冒泡排序”。
- 这个方法非常简单,但效率低下。
- 在第一次循环中, 你需要进行1279次对比,
- 第二次循环则需要1278次,
- 总计818560次对比。
- 按每次比较需要1秒, 这一过程将长达9天。
- 第二种方法是 先将前两本排序。
- 然后,将第三本书和第二本进行排列。
- 如果第三本应位于第二本之前,则交换它们的位置。
- 再它和第一本书进行对比,
- 如果这本书应位于第一本之前,则交换它们的位置。
- 现在,你就完成了前三本的排列。
- 每次将一本书 插入之前已经排列好的队伍中,
- 与前面相邻的一本书进行对比 并判断是否交换,
- 直到这本书到达队伍中正确的位置。
- 这种方法被称为 “插入排序”。
- 与“冒泡排序”不同的是, 这种方法通常不必比对所有相邻的书。
- 一般来说, 每本书被对比的次数
- 只有前者的一半。
- 这样,总共的对比次数
- 也就是409280次。
- 需要将近5天的时间。
- 对比的次数还是太多。
- 还有一种更好的办法:
- 首先,随机抽出一本书,
- 称之为“分界点”, 然后将每本书都与之进行对比。
- 然后,根据“分界点”,
- 把所有应放在它之前的书放在左边,
- 其他的放在右边。
- 这样你就已经节省了大量的时间,
- 因为你再也不必将左边的书,
- 与右边的任何书进行比较。
- 现在,只看左边的一部分。
- 你可以从中再随机抽出一本书,
- 然后以此为另一个“分界点”。
- 你可以像这样不断地进行分割, 产生新的“分界点”,
- 直到得出许多的分支。
- 每一个分支都可以用其他的方法进行重排, 比如 “插入排序”。
- 每次“分界点”循环 所需要的对比次数大约是1280次。
- 如果你的“分界点”分布十分均匀,
- 那么把整列书分成128个分支,每个10本, 大约只需要7次循环,
- 也就是8960秒。
- 将每个分支进行排序, 每个约需22秒。
- 这个方法被称为 “快速排序”。
- 它能将所有的书 在三个半小时之内排列整齐。
- 但是也有特例。
- 取出的分界点可能全都挤在一端, 这样你不会节省任何时间。
- 幸运的是,这种情况几乎不可能发生。
- 这也使得“快速排序”
- 成为编程中最高效的排序方法之一。
- 例如,它被用于网络购物中的价格排序,
- 或是按照距离
- 依次列举出最近的加油站地址。
- 在给书排序的例子中, “快速排序”为你节省了大量的时间。
- 多么充满乐趣的一天。