不守秩序的站队者

/*
多人排成一个队列 , 我们认为从低到高是正确的序列 , 但是总有部分人不遵守秩序。
如果说 , 前面的人比后面的人高 ( 两人身高一样认为是合适的 ),
那么我们就认为这两个人是一对 “ 捣乱分子 ” , 比如说 , 现在存在一个序列 :
176, 178, 180, 170, 171
这些捣乱分子对为
<176, 170>, <176, 171>, <178, 170>, <178, 171>, <180, 170>, <180, 171>,
那么 , 现在给出一个整型序列 , 请找出这些捣乱分子对的个数
*/

//归并排序

#include<iostream>
using namespace std;

int _sum;

void merge( int * list , int s , int m , int t ){
	int * left;
	int * right;
	int len_left = m - s + 1;
	int len_right = t - m;
	int i , j , k;
	left = ( int * ) malloc( len_left * sizeof( int ) );
	right = ( int * ) malloc( len_right * sizeof( int ) );
	for( i = 0 , j = s ; i < len_left ; i ++ ) {
		left[ i ] = list[ j ++ ];
	}
	for( i = 0 , j = m + 1 ; i < len_right ; i ++ ) {
		right[ i ] = list[ j ++ ];
	}
	i = 0;
	j = 0;
	k = s;
	while( ( i < len_left ) && ( j < len_right ) ) {
		if( left[ i ] <= right[ j ] ) {
			list[ k ++ ] = left[ i ++ ];
		}
		else {
			list[ k ++ ] = right[ j ++ ];
			_sum += ( len_left - i );
		}
	}
	while( i < len_left ) {
		list[ k ++ ] = left[ i ++ ];
	}
	while( j < len_right ) {
		list[ k ++ ] = right[ j ++ ];
	}
	free( left );
	free( right );
}

void mergeSort( int *list , int s , int t ) {
	if( s < t ){
		int m = ( s + t ) / 2;
		mergeSort( list , s , m );
		mergeSort( list , m + 1 , t );
		merge( list , s , m , t );
	}
	return;
}

int main() {
	int i = 0;
	_sum = 0;
	int list[ 10 ];
	for( i = 0 ; i < 10 ; i++ ) {
		cin >> list[ i ];
	}
	mergeSort( list , 0 , 9 );
	cout << _sum << endl;
	return 1;
}

//176 178 177 174 172 180 185 188 191 177

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值