浅谈数组排序的交换次数

前言

最近在做初赛题,遇到了一些关于数组排序,问交换次数的题目。刚开始感觉这种题目好难,在网上也很难查到相关的证明,于是自己思考了一下,也问了老师,想记录下我的成果。
我目前做到的题目大致可以分为两类,一类是不知道数组的具体元素求最坏情况下的最少比较次数,一类是知道具体元素求最少交换次数。

不知道数组的具体元素求最少比较次数

以一道初赛真题引入。
将5个数的序列排序,不论原先的顺序如何,最少都可以通过()次比较,完成从小到大的排序。(2006年第10题)
A.6 B.7 C.8 D.9 E.10

怎么做呢?你能想到的方法都得比较8次,然而答案是B.7次。实践证明,确实可以通过某种很复杂的方法,达到7次。但其实是有个非常简单的公式的。
2xn! 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删掉了。
这样就证明了选择排序的每次交换就相当于在置换环中删一个数。而根据置换环理论,要删的数的个数就等于最少交换次数。
至此,我们就用置换环理论证明了选择排序理论。

总结

也许我的证明会显得有些繁琐,但对于初赛来说,结论比证明重要得多。不过还是希望在大家记住结论的基础上,我的证明能有所帮助。我的证明可能并不是最好的,如果大家有什么更好的方法,也希望大家能告诉我。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TreeSet是一个有序的集合,它根据元素的自然排序进行排序。如果在创建TreeSet时没有指定Comparator,那么将使用元素的自然排序元素的自然排序是通过实现Comparable接口来定义的。 如果元素没有实现Comparable接口,则在创建TreeSet时必须提供Comparator来定义排序顺序。Comparator可以在创建TreeSet时通过构造函数参数传递。 TreeSet使用红黑树来实现排序。红黑树是一种自平衡二叉搜索树,它保证了插入,删除,查找操作的时间复杂度为O(log n)。在红黑树,每个节点都有一个颜色属性,它可以是红色或黑色。红黑树满足以下规则: 1. 每个节点都是红色或黑色。 2. 根节点是黑色。 3. 每个叶子节点(NIL节点,空节点)是黑色的。 4. 如果一个节点是红色的,则它的两个子节点都是黑色的。 5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。 通过这些规则,红黑树可以保证在插入,删除,查找操作时,树的高度不会超过log2(n),因此它的时间复杂度为O(log n)。 当我们向TreeSet添加元素时,它会按照元素的自然排序或者通过Comparator定义的排序规则,找到合适的位置插入新元素。在插入完成后,TreeSet会自动进行平衡操作,以保持红黑树的平衡性。当我们从TreeSet删除元素时,它也会自动进行平衡操作。 总结起来,TreeSet的排序原理是通过红黑树实现的,它使用元素的自然排序或者通过Comparator定义的排序规则进行排序。在插入和删除元素时,TreeSet会自动进行平衡操作,以保持红黑树的平衡性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值