计算冒泡排序的交换次数:
逆序数概念:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序
一个排列中所有逆序总数叫做这个排列的逆序数。 所以冒泡排序结束即是所有的逆序数为0
思路:
暴力:我们可以开一个vis[]数组记录 在遍历到第 i 位时,已经出现的值有哪些。然后遍历到 arr[i] (第i位的值),得到小于arr[i] 的出现个数(即 i<j && arr[i]<= arr[j]的个数)
然后再用当前长度 i 减去符合条件个数即得打 arr[i]的逆序个数。
优化:由于每次都要对小于 arr[i]的出现元素遍历,我们就希望能够开一个数组 记录arr[i]之前出现的符合条件个数(这样就不用每次都遍历一次取求)
那么对于单点更新,求区间和 ,我们就可以借助 树状数组 这个数据结构。所以就利用 树状数组进行优化。
操作:
求出数列种每一个数的逆序数求和
遍历a[i],a[i]再bit[i]中对应的值加一
记录每个值出现前小于自身,自身出现次数
遍历到j时a[j]前有j个数,即小于自身个数有bit[j]个
逆序数为 j - bit[j]
//计算冒泡排序的交换次数: //逆序数概念,冒泡排序结束即是所有的逆序数为0 //思路:求出数列种每一个数的逆序数求和 //遍历a[i],a[i]再bit[i]中对应的值加一 //记录每个值出现前小于自身,自身出现次数 //遍历到j时a[j]前有j个数,即小于自身个数有bit[j]个 //逆序数为 j - bit[j] #include <bits/stdc++.h&g