数组------数组中的逆序对
来源:互联网 发布:韩国女演员排行知乎 编辑:程序博客网 时间:2024/06/09 16:11
题目描述:
给定一个数组,求该数组中的逆序对的个数.
分析:
1. 最简单的方法是使用暴力枚举法.用双重循环,一一比对数组中的每个元素与排在他后面的所有元素,此方法的时间复杂度是O(n^2).
void func(vector<int>& data){ if(data.size() < 1) return 0; int count = 0; for(int i = 0; i < data.size(); i++){ for(int j = i + 1; j < data.size(); j++){ if(data[i] > data[j]) count++; } } return count;}
- 可用归并排序的方法,以降序的方式得到结果.具体来说,在前半部分的第i个元素与后半部分的第j个元素比较时,若arr[i] > arr[j],则就有逆序对个数为后半部分从j开始到结束的元素个数.(因为是降序,所以在arr[j]以后的元素肯定也比aee[i]小) 这样当使用二路归并把原来的数组按降序排好时,逆序对也就统计出来了.
long count = 0;int func(vector<int>& data){ if(data.size() < 1){ return 0; } MergeSort(data, 0. data.size() - 1); return count;}void MergeSort(vector<int>& data, int first, int end){ if(first < end){ int mid = first + (end - first)/2; MergeSort(data, first, mid); MergeSort(data, mid + 1, end); Merge(data, first, mid, end); }}void Merge(vector<int>& data, int first, int mid, int end){ vector<int> tmp; int i = first, m = mid, j = mid + 1, n = end; while(i <= m && j <= n){ if(data[i] > data[j]){ tmp.push_back(data[i]); count += n - j + 1; //由于是降序,当arr[i] > arr[j]时,arr[j]之后的元素也都小于arr[i],所以逆序对的数目就是从arr[j]开始到结束位置的元素个数即 n - j + 1 个. }else{ tmp.push_back(arr[j]); } } while(i <= m) tmp.push_back(arr[i++]); while(j <= n) tmp.push_back(arr[j++]); int k = 0; while(int i = first; i <= end && k < tmp.size(); i++, k++) data[i] = tmp[k];}
1 0
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- Hadoop2.7.0学习——伪分布式搭建
- 为元素添加多个background-image
- iOS开发:在Xcode中使用Git进行源码版本控制
- redis详解(二)-- 数据类型详解
- 达内学习笔记——函数指针
- 数组------数组中的逆序对
- EasyUI 组合树
- 非composer方法扩展yii-jui组件
- Scala的那些奇怪的符号(二) [+T]和[-T]
- Android Studio;Gradle:unable to delete file
- Bugly不认真看文档,遇到的坑
- 时光机穿梭
- 使用apktool 反编译apk以及使用aapt查看apk信息
- HIVE中join、semi join、outer join举例详解