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;
}
}