根据伪代码写程序,实现的功能为归并排序,并输出res(res可能是用来记录元素交换了多少次,本人不是很确定,当然这并不影响做出这一题)
输入样例:
10
8 2 5 4 10 2 9 4 3 10
输出样例:
41
1、数组b用静态数组,记得大小要合适
#include <iostream>
using namespace std;
long long F(long long a[],int l,int mid,int r)
{
long long i=l,j=mid,k=0,res=0;
int b[r];
while(i<mid&&j<r) {
if(a[i]<a[j])
b[k++] = a[i++];
else {
b[k++] = a[j++];
res += mid - i;
}
}
while(i<mid) {
b[k++] = a[i++];
}
while(j<r) {
b[k++] = a[j++];
}
for(int i=0; i<=k-1; i++) {
a[l+i] = b[i];
}
return res;
}
long long H(long long a[],int l,int r)
{
long long res = 1;
if(l+1 == r)
return res;
if(l < r) {
int mid = (l+r)/2;
res += H(a,l,mid);
res += H(a,mid,r);
res += F(a,l,mid,r);
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
long long a[n];
for(int i=0; i<n; i++) {
scanf("%lld",&a[i]);
}
printf("%lld\n",H(a,0,n));
return 0;
}
/*
10
8 2 5 4 10 2 9 4 3 10
*/
2、数组b用动态数组,但会更耗时
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
ll F(int a[],int l,int mid,int r)
{
int i=l,j=mid;
ll res=0;
vector<ll> b;
while(i<mid&&j<r) {
if(a[i]<a[j])
b.push_back(a[i++]);
else {
b.push_back(a[j++]);
res += mid - i;
}
}
while(i<mid) {
b.push_back(a[i++]);
}
while(j<r) {
b.push_back(a[j++]);
}
for(int i=0; i<=b.size()-1; i++) {
a[l+i] = b[i];
}
return res;
}
ll H(int a[],int l,int r)
{
ll res = 1;
if(l+1 == r)
return res;
if(l < r) {
int mid = (l+r)/2;
res += H(a,l,mid);
res += H(a,mid,r);
res += F(a,l,mid,r);
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0; i<n; i++) {
scanf("%d",&a[i]);
}
printf("%lld\n",H(a,0,n));
return 0;
}