奇偶交换排序法最坏情况复杂度的证明

奇偶交换排序法最坏情况复杂度的证明

概述:

奇偶排序法的思路是在数组中重复两趟扫描。第一趟扫描选择所有的数据项对,a[j]和a[j+1],j是奇数(j=1, 3, 5……)。如果它们的关键字的值次序颠倒,就交换它们。第二趟扫描对所有的偶数数据项进行同样的操作(j=2, 4,6……)。重复进行这样两趟的排序直到数组全部有序。而最坏情况为将一个逆序数列正序排序。
建议在证明的时候,自己先手动模拟一遍,看一下其中的规律会更加好懂。以下证明中"[ ]"意为向下取整。

分析:

1. 结束条件:连续两次没有交换操作,证明序列已经有序
2. 奇数趟比较次数:[n/2],偶数趟比较次数:[(n-1)/2]
当n为偶数时:[n/2] + [(n-1)/2] = n/2 + (n-2)/2 = n-1
当n为奇数时:[n/2] + [(n-1)/2] = (n-1)/2 + (n-1)/2 = n-1
所以每两趟的比较次数为:n-1
当逆序时,对于每一个a[k] (1 <= k <= n),最开始会出现两种情况。

  • 情况一:因为位置在偶数位比前面k-1个数小,进行k-1趟比较,交换到首位。又因为在逆序中第k位,在正序中应该是第n+1-k位,所以到达首位后,回到正序位置又需要n-k趟,总共n-1趟。
  • 情况二:因为位置在奇数位比后面n-k个数小,进行n-k趟比较,交换到最后一位。又因为在逆序中第k位,在正序中应该是第n+1-k位,所以到达最后一位后,回到正序位置又需要k-1趟,总共n-1趟。

实际上,当a[k]在首位或最后一位时(在交换过程中,a[k]总会被移到一次首位或最后一位),因为在这个时候必然会有一次对奇(偶)数的位置进行排序的趟,所以会出现一次正好a[k]不被比较的情况,即有一趟比较a[k]被闲置了。所以要让a[k]回到正序位置会多出这一趟,总共要n趟。
当n为偶数时:n/2*(n-1)=n(n-1)/2
当n为奇数时:(n-1)/2*(n-1)+ [n/2] = n(n-1)/2
所以序列变为正序一共需要n(n-1)/2次比较。注意还有两趟共(n-1)次比较检验是否排序完成。所以排序完成的总比较次数为:(n-1)(n+2)/2次

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值