前言
最近在做初赛题,遇到了一些关于数组排序,问交换次数的题目。刚开始感觉这种题目好难,在网上也很难查到相关的证明,于是自己思考了一下,也问了老师,想记录下我的成果。
我目前做到的题目大致可以分为两类,一类是不知道数组的具体元素求最坏情况下的最少比较次数,一类是知道具体元素求最少交换次数。
不知道数组的具体元素求最少比较次数
以一道初赛真题引入。
将5个数的序列排序,不论原先的顺序如何,最少都可以通过()次比较,完成从小到大的排序。(2006年第10题)
A.6 B.7 C.8 D.9 E.10
怎么做呢?你能想到的方法都得比较8次,然而答案是B.7次。实践证明,确实可以通过某种很复杂的方法,达到7次。但其实是有个非常简单的公式的。
2x≥n!
2
x
≥
n
!
,最小的x就是n个数的序列排序的最少交换次数
至于证明,我并不会,只能大概提供一个思路。n个数有
n!
n
!
种可能排列方法,而每一次比较应该能排除掉一半的可能排列方法。所以大概可以得到上面的公式。
知道具体元素求最少交换次数
还是以一道初赛真题引入。
将数组{8,23,4,16,77,-5,53,100}中的元素按从大到小的顺序排列,每次可以交换任意两个元素,最少需要交换()次。(2008年第5题)
A.4 B.5 C.6 D.7 E.8
答案是B
虽然乱做可以做出正确答案,但我还是要讲一下方法
置换环理论
还是以上面的题为例子。
排完序后的数组为{100,77,53,23,16,8,4,-5}。也就是说100要放到8的位置上,而8又要放到-5的位置上,-5又要放到100的位置上。这样就形成了一个位置交换环,简称置换环。100先和8换一下位置,8再和-5换一下位置,这三个数就能归位了。100,8,-5这三个数可以通过2次交换,不需要和其它的数交换,显然这样是最优的。可以发现,若一个置换环中有n个元素,则可以通过n-1次交换使得这n个元素归位。那么总的交换次数就是置换环的数量-1。
结论是:最少交换次数就是总元素的个数-置换环的数量。
至于证明嘛,这样显然是最优的。因为每个置换环相互独立,互不干扰,而每一个置换环所需最少交换次数又是元素个数-1(这也是显然的),不可能再少了,所以这样就是最少的。
选择排序理论
先给出结论。
模拟选择排序。选择排序的原理是第i轮把第i大(小)的数归位。按照轮来模拟,得到的交换次数就是最少交换次数。
以例题为例,进行模拟。
原数组{8,23,4,16,77,-5,53,100}
先把最大的数100归位{100,23,4,16,77,-5,53,8}
再把第二大的数77归位{100,77,4,16,23,-5,53,8}
再把第三大的数53归位{100,77,53,16,23,-5,4,8}
再把第四大的数23归位{100,77,53,23,16,-5,4,8}
发现第五大的数16已归位
再把第六大的数8归位{100,77,53,23,16,8,4,-5}
然后发现4和-5已自动归位
共需5次交换
两种理论的统一
其实是用置换环理论证明选择排序理论,因为选择排序理论操作起来方便一些。
以一个数组为例。原数组A={4,3,5,2,1}
从小到大排完序后的数组B={1,2,3,4,5}
我们建立如下映射:x->y表示x应该放在y现在所在的位置上,其实就是B数组到A数组的映射。
这5个数建立的映射是:1->4->2->3->5->1
可以发现,这些数的映射构成了一个环,我们称之为置换环。
按照选择排序理论,先把最小的数1归位。
A数组就变成了{1,3,5,2,4}
既然1已经归位,就不再考虑它,剩下4个数建立的映射如下:4->2->3->5->4
4换到了原来1的位置上,那么1前面的5建立的映射就指向了4,而4指向的数依然是2,所以就相当于在原来的置换环中把1删掉了。
这样就证明了选择排序的每次交换就相当于在置换环中删一个数。而根据置换环理论,要删的数的个数就等于最少交换次数。
至此,我们就用置换环理论证明了选择排序理论。
总结
也许我的证明会显得有些繁琐,但对于初赛来说,结论比证明重要得多。不过还是希望在大家记住结论的基础上,我的证明能有所帮助。我的证明可能并不是最好的,如果大家有什么更好的方法,也希望大家能告诉我。