剑指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); } };
相关文章推荐
- 举例讲解C语言对归并排序算法的基础使用
- java实现归并排序算法
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- C++实现自底向上的归并排序算法
- C++实现自顶向下的归并排序算法
- Javascript中的迭代、归并方法详解
- JavaScript希尔排序、快速排序、归并排序算法
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- Java排序算法总结之归并排序
- C#递归算法之归并排序
- C++归并排序算法实例
- Javascript排序算法之合并排序(归并排序)的2个例子
- 归并排序的递归实现与非递归实现代码
- Java编程中实现归并排序算法的实例教程
- java二路归并排序示例分享
- java实现归并排序算法
- 归并排序的实现代码与思路
- js算法:Merge Sort 归并排序
- JavaScript希尔排序、快速排序、归并排序算法
- leetcode 虐我篇之(二) Two Sum