编程科技探索

把乱糟糟的数据排好队

怎么按身高给全班排队?程序员有各种奇妙的“排序算法”,每种都有自己的想法。

7-10岁6分钟编程思维 · 算法 · 排序
图片加载中…

体育课老师要让全班按身高排队——这其实就是“排序”。计算机天天也在做这件事:给成绩排序、给商品按价格排序、给视频按热度排序。怎么排得又快又好?程序员发明了很多“排序算法”。排序看起来简单,里面的学问可大着呢!

你知道吗

你知道吗?有一种叫“猴子排序”的搞笑算法:随机打乱再看看是不是排好了,没排好就再打乱。理论上它能排好,但可能要排到宇宙尽头!程序员用它来开玩笑,提醒大家算法的选择很重要。

冒泡排序:相邻比一比

最简单的排序叫“冒泡排序”。它做的事很简单:从第一个开始,相邻两个比一比,前面的大就换位置。一轮下来,最大的那个就被“冒”到了最后。然后再比前几个,第二大的也冒到倒数第二。像气泡一样,大的一个个浮上去。虽然简单,但如果数据很多,冒泡排序就要比很多很多次,比较慢。

还有一个聪明的叫“选择排序”:先在所有数里找最小的,放在最前面;再在剩下的里面找第二小的,放第二个位置……每次“选”一个最小的放好。还有“插入排序”,像打扑克整理手牌一样,一张一张插到对的位置。不同的算法各有优缺点,程序员会根据情况挑选。

如果数据特别多,比如几亿条,简单算法就太慢了。这时程序员会用更厉害的算法,比如“快速排序”:随便挑一个数当“队长”,比队长小的放左边,比队长大的放右边,然后两边再各挑一个队长继续分……这样越分越小,最后拼起来就排好了。快速排序就像把一大堆书先分成几堆,再一堆堆整理,比一本一本比快多了。

  • 冒泡排序:相邻比较,大的往后冒
  • 选择排序:每次挑最小的放前面
  • 插入排序:像整理扑克牌一样
  • 快速排序:挑队长分两边,又快又聪明
  • 不同算法各有优缺点,按需挑选

为什么要学这么多算法?

你可能会问:有一种算法不就好了吗?因为每种算法在不同情况下表现不一样。数据几乎已经排好的时候,插入排序特别快;数据完全乱的时候,快速排序更厉害;数据很少的时候,简单的冒泡排序就够用。程序员就像厨师,要知道哪道菜配哪种锅,才能做出又快又好的饭。

动手试试

不插电小游戏:找 8 张数字卡片(1-8)打乱排成一排。用“冒泡排序”的方法,从左到右相邻两张比较,前面大就换,一轮下来最大的到了最右。再来一轮……直到全部排好。数一数你一共比了多少次、换了多少次?再试试“选择排序”:每次找最小的放最前面,看看比了多少次。两种算法哪种更快?

秩序是自由的基石。——谚语