【问题标题】:Expected number of swaps in bubble sort [duplicate]冒泡排序中的预期交换次数[重复]
【发布时间】:2012-07-05 14:45:45
【问题描述】:

可能重复:
Number of swaps in Bubble Sort

问题简述如下:
给定一个由N个整数组成的数组A,数组中的每个元素都可以以一定的概率p[增加一个固定数b i],0 i n。我必须找到预期的交换次数,以便使用bubble sort 对数组进行排序。

我尝试了以下方法:

1) 元素 A[i] > A[j] 对于 i j的概率> 可以很容易地从给定的概率中计算出来。 2) 使用上述方法,我计算出预期的掉期次数为:

double ans = 0.0;
for ( int i = 0; i < N-1; i++ ){
    for ( int j = i+1; j < N; j++ ) {
        ans += get_prob(A[i], A[j]); // Computes the probability of A[i]>A[j] for i < j.

基本上我想到了这个想法,因为预期的交换次数可以通过数组的反转次数来计算。因此,通过利用给定的概率,我正在计算一个数字 A[i] 是否会与一个数字 A[j] 交换。

我之前发布过a similar question,但它没有所有限制。

无论我是否走在正确的轨道上,我都没有得到任何好的提示,所以我在这里列出了所有的限制。如果我以不正确的方式思考问题,请给我一些提示。

【问题讨论】:

  • 您也可以执行冒泡排序并计算实际交换次数;) 无论如何,您说“数组的每个元素都可以增加一个固定数字 'b',概率为 p[i ]。”。什么时候发生?每次交换?排序前?
  • 这发生在数组排序之前。而且我认为执行冒泡排序会使程序变得非常慢,因为它增加了复杂性,我必须为数组的每个可能配置运行它。
  • 你真的认为这是一个编程问题吗?这听起来像是一个需要在纸上完成的问题。如果你在写程序,找到这个预期的数字,这个有什么实际用途?
  • 什么是初始数组?答案在很大程度上取决于它是什么,或者分布是什么。
  • @TheRock,请告诉我我是否做对了。初始数组的元素都是相同的,或者是排序好的。然后每个元素可以以一定的概率增加一个固定的数量。之后进行理论上的冒泡排序,你需要计算这种排序的交换量吗?

标签: c++ algorithm math


【解决方案1】:

给定元素的预期交换次数只是其左侧大于它的预期元素数量。

您可以通过指标变量的方法以及预期值具有linearity property这一事实快速计算。

假设您正在考虑元素a_3。那么预期的交换次数就是简单

E[#a_3 的交换次数] = E[a_0 > a_3] + E[a_1 > a3] + E[a_2 > a_3]

右侧的每个个体期望都可以使用基本概率轻松计算。

那么预期的交换总数就是每个元素的预期交换数的总和除以 2(因为你重复计算)。

【讨论】:

  • 我不明白为什么它被二除。能否请您多指教一下?
  • 如果你有最小序列 [2, 1],你会计算两次交换而不减半,因为你会期望一个交换 2 和一个交换 1。但是对于每个交换,有两个涉及的元素。
  • @Vatine :为什么我希望交换 2,因为它没有任何剩余的元素大于上面答案中所说的,我只会计算一个交换1 因为它是唯一可以在其左侧具有大于它的值的元素。
  • 为了让事情更清楚,下面是一个小例子。假设数组的元素是 [10, 20] 并且每个元素可以增加 15(固定数字)的概率对于两者都是 0.5。然后我可以有数组 [10,15]、[10,30]、[25,15]、[25,30] 的 4 种配置。所以我希望在案例 3 中只有一次交换,通过计算得出预期的交换次数为 0.25。
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多