冒泡排序交换次数计算

给定一个1~n的数列,求出冒泡排序升序排列需要的交换次数

思路:需要用数据结构BIT来进行优化

            需要求出数列中每一个数的逆序数,然后求和

            每遍历一个值a[ i ],a[ i ]在BIT[ i ]中对应的值及之后的值要加一,记录每个值出现前 小于自身值出现的次数

            遍历到j时,a[ j ]前有 j 个数,小于自身的个数有bit[ j ]个

            逆序数 = j - bit[ j ]

树状数组能够高效的求出连续一段元素之和或者更新单个元素的值

#include 
#include 
#include 
#include 
#include 
#include 
#include 

typedef long long ll; 
const int maxn = 1e5 + 10;
const int INF = 1e6;

using namespace std;

int n;
int a[maxn];

//BIT
int bit[maxn];

//求和
int Sum(int i){
	ll s = 0;
	while(i > 0){
		s += bit[i];
		i -= i & -i;
	}
	return s;
}

//更新
void Add(int i, int x){
	while(i <= n){
		bit[i] += x;
		i += i & -i;
	}
}

void Solve(){
	ll ans = 0;
	for(int i = 0; i < n; i++){
		ans += i - Sum(a[i]);
		Add(a[i], 1);
	}
	cout << ans << endl;
}
 
//测试函数 
int main(){
	freopen("D:\\钢铁程序员\\程序数据\\079冒泡排序交换次数.txt", "r", stdin);
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
		scanf("%d", &a[i]);
		
	Solve();
	return 0;
} 

 

你可能感兴趣的:(数据结构)