你怎么能算出冒泡排序会执行多少次?

时间:2013-06-12 19:03:40

标签: c++ algorithm sorting bubble-sort

http://www.codechef.com/problems/LEBOBBLE

任何数组的冒泡排序n个整数中的一个按以下方式工作:

var int i, j; 
for i from n downto 1 
{ 
  for j from 1 to i-1 
  { 
    if (A[j] > A[j+1]) 
    swap(A[j], A[j+1]) 
  } 
}

您将获得一个n个整数的数组B.

然后使用数组B创建数组A,如下所示: 对于每个i(1 <= i <= n),我们用概率Pi设置Ai = Bi + d,否则Ai = Bi。 帮助Little Elephant找到当使用上述气泡排序算法对数组A进行排序时,气泡排序将产生的预期交换次数。 输入

输入的第一行包含单个整数T - 测试用例的数量。 T测试案例如下。每个测试用例的第一行包含一对整数n和d。每个测试用例的下一行包含n个整数 - 数组B.下一行包含n个整数 - 数组P. 输出在T行中打印T实数 - 相应测试用例的答案。请将所有数字四舍五入到小数点后的4位数。 约束

1 <= T <= 5
1 <= n <= 50000
1 <= Bi, d <= 10^9
0 <= Pi, <= 100
Example

Input:
2
2 7
4 7
50 50
4 7
5 6 1 7
25 74 47 99

Output:
0.2500
1.6049

您对如何处理此问题有任何提示吗?

1 个答案:

答案 0 :(得分:2)

作为提示 - 冒泡排序中的交换次数等于数组中inversions的数量。有一种着名的分而治之的算法来计算数组在时间O(n log n)中的反转次数 - 你能想出如何做到这一点吗?

希望这有帮助!