搜索、排序和复杂度分析
算法是计算机程序的一个基本构建模块。
算法描述了最终能够解决一个问题的计算过程。
算法的评价标准:
正确性
可读性
可维护性
运行时间性能
复杂度评估
n:工作量与问题规模的增加成正比
n^2: 工作量与问题规模成2次方阶增长
logn: 工作量与问题规模成对数增长
k^n: 工作量与问题规模成指数增长
使用O(n)表示 O表示‘on the order of’
基本排序算法
选择排序
搜索整个列表,找出列表中的最小项,如果该最小项的位置不在第一位,则将其与第一位交换位置。依次类推,直到达到列表的最后一项。
获取列表长度;
遍历列表中的所有位置;
遍历所有需与i位置比较的位置;
如果j位置的数值比i位置大;
交换两位置对应的值;
遍历完后返回列表;
选择排序复杂度O(n^2)
最小复杂度
当列表为已经排好序的列表时,只需执行N次 即复杂度为O(n)
最大复杂度
当列表为倒序时,每个都需和后一个数交换位置,即需要(n-1)+(n-2)+…1 = 1/2n^2 +1/2n 只考虑主项,即N^2
所以选择排序的最大复杂度为nO(^2)
冒泡排序
冒泡排序是将列表中相邻的项两两进行比较,若相临两项顺序不对,则调换两项的顺序。
冒泡排序每执行一轮,会将该轮次所检索到的最大值置于最后,所以下一次检索只需要检索l-1次;
遍历列表中所有项;
将每一项与后一项比较;
若后一项比前一项小,交换对应的值;
返回处理过的列表;
选择排序复杂度O(n^2)
最小复杂度
当列表为已经排好序的列表时,只需遍历i执行N次 即复杂度为O(n)
最大复杂度
当列表为倒序时,每个前面位置的数需要N-i次交换交换到最后位置,即需要(n-1)+(n-2)+…1 = 1/2n^2 +1/2n 只考虑主项,即N^2
所以选择排序的最大复杂度为nO(^2)
插入排序
插入排序的思想是在第i次搜索时,将第i个元素插入到前i个值的合理位置上。
选取目标值;
将目标值下标前的值与该值做比较;
如果前值比目标值大,则将目标值往前移;
如果前值比目标值小,则结束;(因前i-1项是有序的)
遍历到最后一个值;
返回处理过的列表;
插入排序复杂度O(n^2)
最小复杂度
当列表为已经排好序的列表时,只需执行N次 即复杂度为O(n)
最大复杂度
当列表为倒序时,其i后的每个数都需和前面所有元素交换位置,即需要1+2+3+…+n-1 = 1/2n^2 +1/2n 只考虑主项,即N^2
所以选择排序的最大复杂度为nO(^2)
快速排序
由上述流程可知,每执行一次快速排序,会将本次作为基准点的值排序到正确的位置(因为分别遍历并将比它大的值放在右边,比它小的值放在左边),在多次递归后,每个最小单元中的元素都正确排序后,列表也就排序正确了
复杂度计算
最坏情况,当列表数值为倒序排列时,每一次分割分别获得n-i和i 两项, 需进行n-1次迭代分割,且每次都要执行比较的次数是1/2n^2 +1/2n,所有最坏情况下的复杂度是O(n^2)
一般情况下,当分割2^(n/2)次切割后,就能将元素拆分成单个元素,所有在最好情况下的性能为O(nlog2n)
归并排序
归并排序的思想是,将元素拆分成最小的序列,并对最小序列进行排序,再将有序的序列进行合并。返回排列好的列表。
先将列表从中间节点拆分成最小元素,然后构造新的列表按顺序插入到列表中,返回有顺序的列表
归并排序的时间复杂度是O(nlogn)