插入排序以及简单算法的下界
插入排序:
插入排序是最简单的算法之一,实现方法是序列中从第二个数开始之后的的每个数都和它前面的所有数作比较并排好序,所以插入排序为O(N2),是一个精确的界。
图画演示插入排序的基本思想:
C语言实现代码:
(算法代码接受一个含有元素的数组和一个包含元素个数的整数)
void InsertionSort(ElementType A[],int N)
{
int j,p;
ElementType Tmp;
for(p = 1; p <= N; p++)
{
Tmp = A[p];
for(j = p; j > 0 && A[j-1] > Tmp; j--)
A[j] = A[j-1];
A[j] = Tmp;
}
}
简单算法下界的思考:
数字数组的一个逆序是指数组中具有i<j但a[i]>a[j]的序偶(a[i],a[j]),逆序正好是需要由插入排序(非直接)执行的交换次数。
定理1:N 个互异数的数组的平均逆序数为N(N-1)/4
证明:对于含有N个数的表L例如(含四个数的表(8,3,2,5) ),有逆序数为6( (8,3)(8,2)(8,5)(3,2) )。其反序表Lr(5,2,3,8),逆序数为2( (5,2)(5,3) )。表L中任意两个数的序偶(x,y)且y>x,即逆序,恰是表L和表Lr所有逆序( (8,3)(8,2)(8,5)(3,2)(5,2)(5,3) )之中的一个。而表L和表Lr序偶的总个数为表L元素总数N(4)关于2的组合数,即N(N-1)/2,所以一个互异数表与其反序表的逆序数之和是N(N-1)/2,可得任意一个互异数表的平均逆序数为 N(N-1)/4。
定理2:通过交换相邻元素进行排序的任何算法平均需要Ω(N2)
证明:初始的平均逆序数是N(N-1)/4 = Ω(N2),而每次交换只减少一个逆序,因此需要Ω(N2)次交换。
由这个下界可以明白,一个排序算法通过删除逆序得以向前进行,为了更有效的运行,每次交换删除应多于一个逆序。
(文章参考《数据结构与算法分析C语言描述》机械工业出版社)