1.1.3 起泡排序
局部有序与整体有序
在由一组整数组成的序列A[0, n - 1]中,满足A[i - 1] ≤ A[i]的相邻元素称作顺序的;否则是逆序的。
有序序列中每一对相邻元素都是顺序的,所有相邻元素均顺序的序列,也必然整体有序。
扫描交换
可以通过不断改善局部的有序性实现整体的有序:从前向后依次检查每一对相邻元素,一旦发现逆序即交换二者的位置。对于长度为n的序列,共需做n - 1次比较和不超过n - 1次交换,这一过程称作一趟扫描交换。
起泡排序
在起泡交换的过程中,尽管多数时候元素会朝着各自的最终位置不断靠近,但有的时候某些元素也的确会暂时朝着远离自己应处位置的方向移动。
1.1.4 算法
所谓算法,是指基于特定的计算模型,旨在解决某一信息处理问题而设计的一个指令序列。
需具备的要素:
① 输入与输出:在物理上,输出有可能存放于单独的存储空间中,也可能直接存放于原输入所占的存储空间中。上述排序是后者。
②基本操作、确定性与可行性
③有穷性与正确性:证明算法有穷性和正确性的一个重要技巧,就是从适当的角度审视整个计算过程,并找出其所具有的某种不变性和单调性。
其中的单调性通常是指,问题的有效规模会随着算法的推进不断递减。
不变性则不仅应在算法初始状态下自然满足,而且应与最终的正确性相呼应——当问题的有效规模缩减到0时,不变性应随即等价于正确性。
起泡排序算法的不变性和单调性可分别概括为:经过k趟扫描交换之后,最大的前k个元素必然就位;经过k趟扫描交换之后,待求解问题的有效规模将缩减至n - k。
④ 退化与鲁棒性
⑤ 重用性
算法模式可推广并适用于不同类型基本元素的这种特性,即是重用性的一种典型形式。
1.1.5 算法效率
① 可计算性
② 难解性
算法所需时间
③ 计算效率
从时间和空间等方面度量算法的计算成本
④ 数据结构
1.2 复杂度度量
1.2.1 时间复杂度
随着输入规模的扩大,算法的执行时间将如何增长?
执行时间的这一变化趋势可表示为输入规模的一个函数,称作该算法的时间复杂度time complexity)。
特定算法处理规模为n的问题所需的时间可记作T(n)。
在规模为n的所有输入中选择执行时间最长者作为T(n),并以T(n)度量该算法的时间复杂度。
1.2.2 渐进复杂度
若存在正的常数c和函数f(n),使得对任何n >> 2都有
T(n) ≤ c∙f(n)
则可认为在n足够大之后,f(n)给出了T(n)增长速度的一个渐进上界。此时,记之为:
T(n) = O(f(n))
大O记号的性质:
在大O记号的意义下,函数各项正的常系数可以忽略并等同于1
多项式中的低次项均可忽略,只需保留最高次项
将T(n)定义为算法所执行基本操作的总次数
大Ω记号是对算法执行效率的乐观估计——对于规模为n的任意输入,算法的运行时间都不低于Ω(g(n))