积跬步至千里——算法强化训练(1)统计数组中的逆序对
2015-05-14 09:24
295 查看
1、最简单的方法是暴力,对于每一个数都依次和后面的进行比较。
#include <iostream> #include <vector> using namespace std; int InverseParis(vector<int> &data) { size_t num = data.size(); int count = 0; for (size_t i = 0; i < num; ++i) { for (size_t j = i+1; j < num; ++j) { if(data[i] > data[j]) count++; } } return count; } int main() { int a[4]={7,5,6,4}; vector<int> data(a,a+4); cout<<InverseParis(data)<<endl; return 0; }2、利用归并排序的思想,边归并排序,边统计。例如(5,7) (4,6)从后往前,判断出7大于6,则后一个数组里面全部都可以和7组成逆序对,然后判断5,直到4小于5,则4和4前面的都可以和5构成逆序对。
#include <iostream> #include <vector> using namespace std; int InverseParisRes(vector<int> &data,vector<int> ©,int start,int end); int InverseParis(vector<int> &data) { size_t num = data.size(); int count = 0; vector<int> copy(num,0); for (size_t i = 0; i < num; ++i) copy[i] = data[i]; count = InverseParisRes(data,copy,0,num-1); return count; } int InverseParisRes(vector<int> &data,vector<int> ©,int start,int end) { if(start == end) { copy[start] = data[start]; return 0; } int middle = (end - start)/2; int left = InverseParisRes(copy,data,start,start+middle); int right = InverseParisRes(copy,data,start+middle+1,end); int i = start + middle; int j = end,k = end; int count = 0; while (i >= start && j >= start+middle+1) { if(data[i] > data[j]) { copy[k--] = data[i--]; count += j-start-middle; } else { copy[k--] = data[j--]; } } while (i >= start) copy[k--] = data[i--]; while (j >= start+middle+1) copy[k--] = data[j--]; return left + right + count; } int main() { int a[4]={7,5,6,4}; vector<int> data(a,a+4); cout<<InverseParis(data)<<endl; return 0; }
相关文章推荐
- 积跬步至千里——算法强化训练(7)大数问题
- 积跬步至千里——算法强化训练(2)全排列和组合数
- 积跬步至千里——算法强化训练(8)卡特兰数相关题目求解
- 积跬步至千里——算法强化训练(5)关于类的几个操作
- 积跬步至千里——算法强化训练(9)重写标准库函数
- 积跬步至千里——算法强化训练(4)位操作的几个实例
- 积跬步至千里——算法强化训练(6)利用基数排序解决O(n)问题
- 积跬步至千里——算法强化训练(3)数组装水
- js实现常见的几种算法(数组去重、字符统计、二分查找等)
- 统计数组中的逆序对
- 统计数组中的逆序对的数量
- 【算法导论学习-011】数组中的逆序对个数(Counting inversions in an array)
- 白话经典算法系列之十五 “一步千里”之数组找数
- java实现数组逆序的算法 使用函数两个参数
- 树状数组入门—逆序对统计
- 算法学习(二)——树状数组求逆序数
- 【白话经典算法系列之十五】“一步千里”之数组找数
- 算法题目---数组中的逆序对
- 【白话经典算法系列之十五】“一步千里”之数组找数<转>
- O(n*lgn)时间复杂度的逆序对统计算法实现思想