### 线性搜索
想象一下,你在自家的厨房里,把所有的厨具都摊开放在桌面上,每件都带个标签。现在,你在找一个特别的小勺子。你一个接一个的看,直到发现那个标签是“小勺子”的那一件为止。这趟可能很耗时,尤其是你的厨具超多的话。线性搜索,就是这么个“一件一件慢慢来”的意思,时间复杂度是 **O(n)**,就代表了,随着厨具数量 **n** 的增加,你找到东西的时间也会相应地增加。
### 二分搜索
回到刚才找勺子的话题,这次你换了个聪明的策略。你直接猜疑第7件是不是勺子(假设这让你觉得最有可能),不是就猜中线附近另一件……如此这般,每次猜疑,你都把范围缩小一半。这种方法相比一件一件找会快很多,时间复杂度是 **O(log n)**,说明你要用的时间,跟厨具数量的对数差不多,就是说即使厨具超多,找到勺子也不会很慢。
### 冒泡排序
讲到了冒泡排序,你决定把厨具按高度从高到低排个序。你拿过最左的,和紧挨着的下一个比较,如果左边比右边高,你再互换他们的位置。你一遍又一遍地做这个事情,直到没有任何厨具比旁边高了。这样做虽然每次都认真比较,但是时间会随着厨具数量的增加而增加得飞快。排序后的结果——时间复杂度是 **O(n^2)**,所以,数量多的时候,要排整齐,等的时间真的好长。
### 快速排序
还是排厨具,你用了个叫做“快速排序”的绝妙招数。取了最左的一个厨具(假设它最好用)作为基准,比它小的都放一边,比它大的另一边,这样左半边都比它小,右半边都比它大。然后再分别对这两边做同样的事,不断的分区排序。这样子,你利用了这个厨具的“好用”,让排序过程快了很多。即使在最坏的情况下,这个排序的时间复杂度也不太差,平均下来是 **O(n log n)**,意味着随着厨具数量增多,排序时间缓慢增长。
### 哈希表操作
又回到了找勺子的话题。这次,你在勺子上挂了个标签叫"勺子1号",然后把它放在了贴着"1号"标签的抽屉里。下次你要找勺子,看一眼标签就知道去哪个抽屉了,所以几乎不需要花时间,就是那种 "嘀"一下就找到了的感觉。在哈希表中查找东西,平均情况下速度就是 **O(1)**,看起来几乎不受你藏了多少东西(即数据量)的影响。
这些算法的时间复杂度就像是告诉你在不同的情况下,找东西(或解决问题)需要的时间长短。尽可能选择时间复杂度小的算法,就好像是在精打细算下节省时间的技巧一样。