//
//typedef struct IO_FILE
//{
// int fileno;//文件描述符
// int flag;//打开文件方式
// char outbuffer[MAX];//固定的缓冲区大小
// int bufferlen;
//} MY_FILE
//
//MY_FILE *MyFopen(const char *path,const char *mode);
//{
//
//
//
// int fd=open();
//}
//void MyFclose(MyFile *);
//int MyFwrite(MyFile *,void *str,int len)
//void MyFFlush(MyFile *)
//
//
//
#include<bits/stdc++.h>
#include<vector>
#include<iostream>
using namespace std;
vector<int>tmp(100);
int mergesort(vector<int>&nums,int left,int right)
{
if(left>=right)
{
return 0;
}
int ret=0;
int mid=(left+right)/2;
int cur1=left,cur2=mid+1;
int i=0;
ret+=mergesort(nums,left,mid);
ret+=mergesort(nums,mid+1,right);
// while(cur1<=mid&&cur2<=right)
// {
// if(nums[cur1]<=nums[cur2])
// {
// tmp[i]=nums[cur1];
// i++,cur1++;
//
// }
// else
// {
// ret+=(mid-cur1+1);
// tmp[i]=nums[cur2];
// i++,cur2++;
//
// }
//
// }
//
//
// while(cur1<=mid)
// {
// tmp[i]=nums[cur1];
// i++,cur1++;
// }
// while(cur2<=right)
// {
// tmp[i]=nums[cur2];
// i++,cur2++;
// }
//
//
while(cur1<=mid&&cur2<=right)
{
if(nums[cur1]<=nums[cur2])
{
tmp[i]=nums[cur2];
i++,cur2++;
}
else
{
ret+=(cur1-left+1);
tmp[i]=nums[cur1];
i++,cur1++;
}
}
while(cur1<=mid)
{
tmp[i]=nums[cur1];
i++,cur1++;
}
while(cur2<=right)
{
tmp[i]=nums[cur2];
i++,cur2++;
}
for(int j=left;j<=right;j++)
{
nums[j]=tmp[j-left];
}
return ret;
}
int getnum(vector<int>&nums)
{
return mergesort(nums,0,nums.size()-1);
}
int main()
{
vector<int>a;
a.push_back(7);
a.push_back(5);
a.push_back(6);
a.push_back(4);
cout<<getnum(a);
}
数组的逆序对个数
最新推荐文章于 2025-12-12 15:43:51 发布
529

被折叠的 条评论
为什么被折叠?



