您的位置:首页 > Web前端

剑指offer(32)-数组中的逆序对

2016-06-17 16:51 387 查看

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

代码

class Solution {
public:
int count = 0;
int InversePairs(vector<int> data){
int length  = data.size();
return mergeSort(data, 0, length-1);
}

int mergeSort(vector<int>& data, int start, int end) {
// 递归终止条件
if(start >= end) {
return 0;
}

// 递归
int mid = (start + end) / 2;
int leftCounts = mergeSort(data, start, mid);
int rightCounts = mergeSort(data, mid+1, end);

// 归并排序,并计算本次逆序对数
vector<int> copy(data); // 数组副本,用于归并排序
int foreIdx = mid;      // 前半部分的指标
int backIdx = end;      // 后半部分的指标
int counts = 0;         // 记录本次逆序对数
int idxCopy = end;      // 辅助数组的下标
while(foreIdx>=start && backIdx >= mid+1) {
if(data[foreIdx] > data[backIdx]) {
copy[idxCopy--] = data[foreIdx--];
counts += backIdx - mid;
} else {
copy[idxCopy--] = data[backIdx--];
}
}
while(foreIdx >= start) {
copy[idxCopy--] = data[foreIdx--];
}
while(backIdx >= mid+1) {
copy[idxCopy--] = data[backIdx--];
}
for(int i=start; i<=end; i++) {
data[i] = copy[i];
}

return (leftCounts+rightCounts+counts);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并排序