题干如下:
假设A[1..n]是一个有n个不同数的数组.若i<j且A[i]>A[j],则对偶(i,j)称为A的一个逆序对(inversion).
a. 列出数组<2,3,8,6,1>的5个逆序对.
b. 由集合{1,2,...,n}中的元素构成的顺me数组具有最多的逆序对?它有多少逆序对?
c.插入排序的运行时间与输入数组中的逆序对的数量之间是什么关系?证明你的回答.
d.给出一个确定在n个元素的任何排序中逆序对的数量的算法,最坏情况需要θ(nlgn)时间.
(提示:修改归并排序)
解:
a.(2,1),(3,1),(8,1),(6,1),(8,6)
b.构成{n,n-1,n-2,...,1}具有最多的逆序对.它有(n-1)+(n-2)+...+1个 即n(n-1)/2个逆序对
c.插入排序的运行时间与输入数组中逆序对的数量成正比关系
插入排序的本质是 对于每一个排列呈逆序的对偶,都要进行一次交换 所以交换次数就是逆序对个数
d.算法为:
将逆序对个数记为x
在第1层 将n个数排列呈n/2组 每组2个数 算出呈逆序对的组别数算出第一层的x 并将呈逆序对的组排列成正序
在第2层 将n/2组正序对合并 每组合并方式为选取组i,i+1中放在最上的较小的数,且每当从组i+1中获取到的较小的数要记x=x+1
...
在第lg(n)层 仅剩最后两组数需要合并 选取两组中放在最上的较小的数 ,如果从第二组中获取到较小的数要记x=x+1
最终 排序完成后 共比较了n/2+n/4+...+1 即(n/2+1)*lgn次 最坏情况的时间复杂度为θ(nlgn)