#joi2013ho5. [joi2013ho5]バブルソート (Bubble Sort)

[joi2013ho5]バブルソート (Bubble Sort)

バブルソートと是什么?

バブルソート是一种用于排序列表的算法之一。假设我们想要将长度为 NN 的数列 AA 按升序进行排序。当存在相邻的两个数的大小关系不正确时,就交换它们的位置。通过从前向后顺序遍历数列来实现这一点。也就是说,如果存在 Ai>Ai+1A_i > A_{i + 1} 的位置,就交换这两个数,对于 i=1,2,ldots,N1i = 1, 2, \\ldots, N - 1,按此顺序进行操作称为一次遍历。通过重复执行这个遍历 N1N - 1 次,可以将数列按升序排序。

数列 AA 的交换次数是指:

在对数列 AA 应用上述算法时,进行整数交换的次数。(对于被称为冒泡排序的算法和实现,循环的顺序、范围和结束条件可能略有不同。但是已知,应用于相同的数列时,整数交换的次数不会因这些差异而改变。)

例如,下面的程序是用 C 语言编写的一个使用冒泡排序对长度为 n 的整数数组 a 进行排序的函数。

`void bubble_sort(int *a, int n) {   int i, j;   for (i = 0; i < n - 1; ++i) {     for (j = 0; j < n - 1; ++j) {       if (a[j] > a[j + 1]) {         /* The following 3 lines correspond to one exchange of integers */         int x = a[j];         a[j] = a[j + 1];         a[j + 1] = x;       }     }   } }`

问题

给定一个长度为 NN 的数列 AA。假设通过仅交换数列 AA 中任意两个整数一次,得到了数列 AA'。请编写一个程序,求出数列 AA' 的冒泡排序所需的最小交换次数。(注意:初始时交换的两个整数不一定是相邻的。)

限制条件

2leqqNleqq100,0002 \\leqq N \\leqq 100\\,000