经典算法——数组中的逆序对
Posted zhihua_bupt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典算法——数组中的逆序对相关的知识,希望对你有一定的参考价值。
一、题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
二、解题方法
利用归并排序的思想,先把数组分隔成子数组,先统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目。注意在合并两个已排序的子数组后,要更新数组。
class Solution { public: int InversePairs(vector<int> data) { int n=data.size(); return process(data,0,n-1); } int process(vector<int>& data,int start,int end) { //递归终止条件 if(start>=end) { return 0; } // 归并排序,并计算本次逆序对数 vector<int> copy(data); // 数组副本,用于归并排序 int mid=(start+end)/2; int left=process(data,start,mid); int right=process(data,mid+1,end); int p=mid;//p初始化为前半段最后一个数字的下标 int q=end;//q初始化为后半段最后一个数字的下标 int index=end;//辅助数组的下标初始化为最后一位 int count=0;//记录逆序对的个数 while(p>=start && q>=mid+1) { if(data[p]>data[q]) { copy[index--]=data[p--]; count+=q-mid; } else { copy[index--]=data[q--]; } } while(p>=start) copy[index--]=data[p--]; while(q>=mid+1) copy[index--]=data[q--]; for (int i = start; i <= end; i++) { data[i] = copy[i];//更新归并排序后的子数组 } return (left+right+count); } };
以上是关于经典算法——数组中的逆序对的主要内容,如果未能解决你的问题,请参考以下文章