python 冒泡排序 交换次数_【算法28】冒泡排序中的交换次数问题

问题描述

给定待排序数组A,在最多反转K个A的不相交子数组后,对A采用冒泡排序,问最小的swap次数是多少?冒泡排序的伪代码如下:

BubbleSort(A):

循环len(A) - 1次:

for i from 0 to len(A) - 2:

if (A[i] > A[i+1])

swap(A[i], A[i+1])

问题分析

首先,容易分析得到:对于任意待排序数组A,其采用冒泡排序所需要的swap次数=A中逆序对的个数。这是因为冒泡排序的过程就是对于任意两个元素,判断两个元素是否逆序(即小的元素排在大元素之后),如果逆序,则swap。上面的结论是显而易见的。

【思路1】接下来,问题就变为,求给定数组在reverse最多K个子数组之后,A中的逆序对数的最小值。给定一个数组A,求解逆序对数是比较简单的,直接两个for循环判断并计数就可以了。问题难在允许reverse最多K个子数组,这样我们需要依次考虑reverse 0, 1, 2, ..., K个子数组,假设我们此时考虑reverse k (0 =< k <= K) 个子数组, 我们还需要去找到是哪k个子数组,reverse后计算逆序对数,这情况就多了去了,很难理清头绪,这条路似乎难以走通。

【思路2】我们意识到这是一个典型的优化问题,对于复杂优化问题动态规划可是神器,让我们来试试看。运用动态规划需要满足两个条件:(1)重叠子问题,即在求解最优解的过程中会反复求解一些规模更小的子问题;(2)最优子结构,即当前问题的最优解可以通

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值