算法基础训练题(二)



C时间限制:1 毫秒 |  C内存限制:1 Kb
题目内容:

输入描述
有多组测试数据,每组数据占一行。
首先输入一个整数N表示数组元素有N个,接下来输入N个整数
N<=50

输出描述
先输出排序好之后的数组,然后再输出一个数字表示这组数据中逆序对的个数。
所有输出占一行。

输入样例
5 3 1 4 5 2

输出样例
1 2 3 4 5 4
hint:
排序结果为 1 2 3 4 5 。
数组的逆序对有4个。
 
  
代码//主要是归并和求逆序方法组合形成的方法
//归并排序(mergesort),是创建在归并操作上的一种有效排序算法,效率为O(nlogn)。其方法主要是用二分法加递归,先将所有的数二分法拆开,递归,拆的只有两个数,然后再用合并法排序,先两个数内部排好序,然后在合并,两个两个排好序的数再排成一个排好序的4个数,按照这样的方法把数排好。最后合成一组有序的数
#include <iostream>
using namespace std;


int MergeAndCalInversion(int A[], int beg, int mid, int end)
{
	int count=0;
	int temp[100];
	int i = beg, j = mid;
	int k = 0;
	while (i < mid && j < end)
		if (A[i] < A[j])
			temp[k++] = A[i++];
		else{
			temp[k++] = A[j++];
			count+=(mid-i);
     	}
			
	while (i < mid)
		temp[k++] = A[i++];
	while (j < end)
		temp[k++] = A[j++];
	
	for (int v = 0; v < k; v++)
		A[beg + v] = temp[v];
	return count;
}


int MergeSortAndCalInversion(int A[], int beg, int end)
{
	int count = 0;
	if(beg+1 < end)
	{
		int mid = (beg+end)/2;
		count += MergeSortAndCalInversion(A,beg,mid);
		count += MergeSortAndCalInversion(A,mid,end);


		count += MergeAndCalInversion(A,beg,mid,end);
	}
	return count;
}


int main()
{
	int N;
	while(cin >> N)
	{
		int A[100];
		for(int i=0;i<N;i++)
		{
			cin >> A[i];
		}
		
		int count = MergeSortAndCalInversion(A,0,N);
		
		for(int i=0;i<N;i++)
		{
			cout << A[i] << " ";
		}
		cout << count << endl;
	}
} 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值