十大经典算法到底是啥?看完这篇终于搞懂了
说实话,我第一次听到“十大经典算法”这个说法的时候,脑子里完全是一团浆糊。
这玩意儿到底指什么?排序?搜索?机器学习?好像哪儿哪儿都有它的影子。
后来查了资料才发现,原来业界常说的“经典算法”主要分成两拨:一拨是我们面试必备的排序算法,另一拨是计算机解决问题的核心思想。今天咱们就聊聊这个,内容有点干,但我尽量讲得有意思点。
一、排序界的“老六”——基础排序三兄弟
1. 冒泡排序:这名字起的真接地气
要我说,冒泡排序绝对是所有算法里名字最形象的。

它怎么工作的呢? 想象一下水底的气泡往上冒,越往上越大。算法也是这个理——每次比较两个相邻的元素,如果顺序错了就把它们换位置。一轮下来,最大的那个数就像气泡一样“冒”到了最右边。
一句话概括:冒泡排序就是不停折腾,把最大的往后挪。
这算法代码写起来是真简单,但效率嘛...时间复杂度是O(n²),数据多了能把你急死。我大学那会儿老师让我们手写这个,真是写一次怀疑一次人生。
不过它也有优点——稳定。啥意思呢?相等的数据不会被调换顺序,这在某些场景下还挺关键的。
2. 选择排序:实在人干实在事
选择排序的思路特别实诚:
每一轮都从剩下的数据里挑出最小的,放到正确位置。
就像你整理房间一样,先把所有东西摊开,然后一件一件归位。简单粗暴,不需要啥技巧。
但它有个致命缺点——不稳定。举个例子:[5, 5, 3] 排序后,第一个5可能会跑到第二个5后面去,原来相等的数据顺序变了。
3. 插入排序:像整理扑克牌
这个算法,我觉得是最符合人类直觉的。
想象你手里有一把乱序的扑克牌,一张一张插到正确位置。右边已经排好序了,左边抽一张,往右边去找它该待的地儿。
特点:数据越接近有序,效率越高。
所以它特别适合基本有序的小规模数据。你要是让我排序10个8个的数,我肯定首选插入排序,代码少、效果快。
二、排序界的“卷王”——高级排序
4. 希尔排序:插入排序的升级版
这名字听着挺洋气,其实就是插入排序的亲戚。
它怎么玩的呢?先把数据按照一定间隔分组,各组内用插入排序;然后缩小间隔,再排;直到间隔变成1,彻底排完。
说白了就是:分而治之,先粗调再精调。
这一下子就把插入排序的缺点给治了,速度快了不少。算是算法里的“smart guy”。
5. 归并排序:分久必合
“分治”思想的典型代表。
它的套路是:先把数据劈成两半,分别排序,然后再合并起来。就像把一堆乱麻将分成两堆,各自排好,再拼成一个有序的整体。
特点:稳定,速度快,时间复杂度O(n log n)。
但它有个毛病——需要额外的内存空间。你要排序1G的数据,可能得准备1G的临时空间。内存紧张的时候,这玩意儿能用但肉疼。
6. 快速排序:面试场的常客
这可能是所有排序算法里最出名的一个。
套路很简单:先选一个基准元素,把数据分成两部分,左边的都比它小,右边的都比它大。然后对这两部分递归执行同样的操作。
快排之所以快,是因为:原地排序,不需要额外空间,时间复杂度平均是O(n log n)。
但你说它完美吗?那倒也不是。最坏情况(比如数据已经有序)会退化成O(n²),这时候效率感人。
所以面试官特别喜欢问快排,不是没道理的。
7. 堆排序:二叉树的妙用
这个算法吧,属于那种听起来很高深,用起来很爽的类型。
它利用了二叉堆这种数据结构。你把数据建成一个堆,然后不断把堆顶(最大或最小)拿走,再调整堆,重复操作,就排好序了。
时间复杂度稳定O(n log n),不需要额外空间。
听起来挺完美?但实际用的人不多,因为常数因子大,缓存也不友好。不过如果你要排序海量数据,堆排序还是很香的。
三、其他经典算法
8. 基数排序:不比较大小
这玩法就有点另类了。
它不比较大小,而是按位数来排序。先按个位排,再按十位排,再按百位排...最后整体就有序了。
适合:整数排序,特别是数据范围不大的时候。
你说它巧不巧?确实巧。但局限性也明显——只能排整数,负数小数还得特殊处理。
9. 计数排序:桶的极致简化
如果数据范围特别集中,计数排序能快到你怀疑人生。
比如排序1000个人的考试成绩(0-100分),直接搞个101大小的数组,统计每个分数出现几次,然后按顺序输出来就行了。
时间复杂度O(n+k),空间换时间。
局限性嘛,范围太大了就歇菜。
10. 桶排序:计数排序的进阶
原理差不多,但更灵活一点。
把数据分到若干个桶里,每个桶内部排序,然后再按顺序把所有桶合并。能不能打,就看桶怎么分了。
写在最后
写到这里突然发现,十大算法说来说去好像全是排序?
也确实,排序是计算机最基础的操作之一,几乎所有程序员面试都得过这一关。
但我想说的是:算法不只是排序。
除了这些,还有贪心算法、分治思想、动态规划、回溯、图算法等等,每一個都是解决不同问题的钥匙。排序只是冰山一角。
你有没有发现,学算法最大的困难不是“不会”,而是“没用上”?
平时CRUD写习惯了,谁还管什么时间复杂度?但是,一旦遇到性能问题,这些“老古董”可就是救命稻草了。
行了,今天就聊到这儿,有啥问题评论区唠唠?

还没有评论,来说两句吧...