搜索
定义:
- 搜索的算法过程就是在一些项的集合中找到一个特定的项。
常见搜索算法
顺序搜索
复杂度:O(n)
- 对一个长度为N的序列(无序状态下也可认为是元素数量为N的集合),根据每一项的相对位置,从一端作为开始端,一项一项的比对,搜索目标。
- 缺点:如果列表有序的情况下,从头到尾的搜索会消耗不必要的成本,如果目标不在序列中,必须对每个列表元素进行比对,也就是N次比对。
二分搜索
复杂度:O(log(n))
- 对于一个长度为N的有序序列(按一定规律排列),从 N/2 的位置对序列进行比对,根据比对情况可以确定搜索目标所处的位置在 N/2 之前或者之后,然后继续与 N/2-N/(22)或 N/2+N/(22) 进行比对,重复这个过程直至搜索完毕。
- 缺点:必须是有序序列,对序列进行排序的成本是未知的。
散列
复杂度:O(1)
- 散列是一种数据结构,利用散列可以很快的完成搜索任务。它通过散列函数对其中的元素与其索引产生映射,当搜索一个目标时,使用散列函数对目标进行计算就可以了得到搜索目标的存储位置。
- 缺点:存在多个元素经过散列函数计算后的索引相同的 冲突 问题。
排序
定义:
- 很简单,按照一定的规律对集合中的元素进行排列。
排序算法
冒泡排序
复杂度:O(n*n)
- 冒泡排序是最简单直接的一种方式,对列表进行多次遍历,每次遍历过程中对相邻的两个元素进行比对(若顺序错误则交换位置)。
- 缺点:因为冒泡排序必须要在最终位置找到之前不断交换数据项,所以它经常被认为是最低效的排序方法。
短路冒泡排序
复杂度:最坏O(n*n)
- 冒泡排序的改良版,当发现序列已经有序后停止排序。
- 缺点:对于完全无序的序列与冒泡排序差别不大,且因为需要判断是否有序,需要额外的成本。
选择排序
复杂度:O(n*n)
- 选择排序每遍历一次列表只交换一次数据,即进行一次遍历时找到最大的项,完成遍历后,再把它换到正确的位置。
- 缺点:必须进行n-1次比对才能完成排序。
插入排序
复杂度:O(n*n)
- 插入排序总是保持一个位置靠前的已排好的子表,然后每一个新的数据项被“插入”到前边的子表里,排好的子表增加一项。
- 缺点:成本受待排列数据影响。
希尔排序
复杂度:O(n)和O(n*n)之间
- 希尔排序有时又叫做“缩小间隔排序”,它以插入排序为基础,将原来要排序的列表划分为一些子列表,再对每一个子列表执行插入排序,从而实现对插入排序性能的改进。划分子列的特定方法是希尔排序的关键。我们并不是将原始列表分成含有连续元素的子列,而是确定一个划分列表的增量“i”,这个i更准确地说,是划分的间隔。然后把每间隔为i的所有元素选出来组成子列表。
- 缺点:成本受待排列数据和选取间隔“i”影响。

归并排序
复杂度:O(n log(n))
- 归并排序是一种递归算法,它持续地将一个列表分成两半。如果列表是空的或者只有一个元素,那么根据定义,它就被排序好了(最基本的情况)。如果列表里的元素超过一个,我们就把列表拆分,然后分别对两个部分调用递归排序。一旦这两个部分被排序好了,那么这种被叫做归并的最基本的操作,就被执行了。归并是这样一个过程:把两个排序好了的列表结合在一起组合成一个单一的,有序的新列表。
- 缺点:成本受待排列数据影响,归并的过程需要额外存储空间。
快速排序
复杂度:O(n log(n))最坏O(n*n )
- 快速排序首先选择一个中值。中值的作用在于协助拆分这个列表。中值在最后排序好的列表里的实际位置,我们通常称之为分割点的,将中值存入一个暂存位,两端设置标志位low和high,先是high位置元素与中值对比,如果high位置元素大于中值则high减1,继续比对直至high位置元素小于等于中值,将high位元素赋值给low位元素,然后开始low位置元素与中值对比,low位置元素小于中值则low加1,继续比对直至low位置元素大于中值,将low位元素赋值给high位元素,然后继续用high位元素与中值比对,循环至low和high相遇,然后将中值赋值给相遇的low位置元素,中值是用来把列表变成两个部分来随后分别调用快速排序函数的。
- 缺点:成本受待排列数据和中值影响。