前言
本文的主要内容是 以选择排序算法为例进行算法运行时间的分析。
选择排序
选择排序算法大家都很熟悉,所以不会详细介绍其原理,功能是实现数组的非降序排序。伪代码如下:
SELECTION_SORT( A ) 运行 时间 次数
for i = 1 to length[A]-1 c1 n
do min= i c2 n-1
for j = i+1 to length[A] c3 ∑_(i=1)^(n-1)▒〖n-i+1〗 ps:参见注1
do if A[min] > A[j] c4 ∑_(i=1)^(n-1)▒〖n-i〗
then min = j c5 t
temp = A[i]; c6 n-1
A[i] = A[min]; c7 n-1
A[min] = temp; c8 n-1
使用循环不变式来检验算法的正确性:
初始化 :第一次迭代式i = 1,在第一次迭代之前i = 0,退出循环,相当于空数组进行排序。始终成立
保持 :假设i = 3 < length[A] - 1;则表示A[1...3]为有序,A[4...length[A]]为无序,即从A[4....length[A]]中找出一个最小值与A[4]交换,从而使i = 4 时能够满足A[1...4]为有序。
结束 :最后一次迭代式i = length[A-1],那么当i = length[A]是,已退出循环,结束函数,而此时A[1....length[A]]已是个数为n的有序序列了,所以算法正确。
计算选择排序算法的运行时间
T = c1*n + c2*(n-1) + c3*(n-i+1)*(n-1) + c4*(n-i)*(n-1) + c5*t + (c6 + c7 + c8)*(n-1)
最好情况: t = 0 则T = ((c3+c4)/2) * n2 + (c1+c2+c3/2-c4/2+c6+c7+c8)*n - (c2+c3+c6+c7+c8); T = an2 + bn + c
最坏情况: t = ∑_(i=1)^(n-1)▒〖n-i〗; 则T = ((c3+c4+c5)/2) * n2 + (c1+c2+c3/2-c4/2-c5/2+c6+c7+c8)*n - (c2+c3+c6+c7+c8);T = an2 + bn + c
所以在最好最坏的情况下,运行时间都为n2级。
注1:由于粘贴不过来,所以用图片替代: == ∑_(i=1)^(n-1)▒〖n-i〗
== ∑_(i=1)^(n-1)▒〖n-i+1〗