使用归并排序计算逆序对个数
2017-10-27 14:30
267 查看
给出一个数组 arr[8] = {8,7,4,5,4,10,2,1},比如8,7就是逆序,使用归并排序找出逆序对的个数,代码如下:
一个完整的自底向上的归并排序只需要修改两个地方就实现了上述的计算数组中逆序对个数的算法。
#include <iostream> int nixu = 0;//定义一个全局变量来存储逆序对的个数 using namespace std; template <typename T> void __merge(T arr[], int l, int mid, int r) { T aux[r-l+1]; for (int i = l; i <= r; ++i) { aux[i-l] = arr[i]; } int i = l, j = mid + 1; for (int k = l; k <= r; ++k) { if(i > mid) { arr[k] = aux[j-l]; j++; } else if (j > r) { arr[k] = aux[i-l]; i++; } else if (aux[i-l] <= aux[j-l]) { arr[k] = aux[i-l]; i++; } else { nixu += mid - i + 1; //关键在于这个地方,每次aux[i-l] > aux[j-l],表明aux[j-l] < aux[i-l...mid-l],所以这个地方增加mid - i + 1 arr[k] = aux[j-l]; j++; } } } template <typename T> void mergeSortBU(T arr[], int n) { //从size=1开始使用自底向上的归并排序 for (int sz = 1; sz <= n; sz += sz) { for (int i = 4000 0; i < n - sz; i += sz + sz) { //[i,i+sz-1]和[i+sz, i+sz+sz-1]归并排序 __merge(arr, i, i+sz-1, min(i+sz+sz-1, n-1) ); } } } int main() { int arr[8] = {8,7,4,5,4,10,2,1}; mergeSortBU(arr, 8); cout << "nixu: " << nixu; return 0; } output: nixu: 21 Process finished with exit code 0
一个完整的自底向上的归并排序只需要修改两个地方就实现了上述的计算数组中逆序对个数的算法。
相关文章推荐
- (应用排序算法编程7.2.2)POJ 2299 Ultra-QuickSort(使用归并排序来计算逆序对的个数)
- 归并排序应用——数组中的逆序对 and 计算数组的小和
- (排序算法的应用7.3.8)UVA 299 Train Swapping(使用冒泡排序来计算逆序对数)
- 【SGU 180】Inversions —— 归并排序或树形数组计算逆序对
- hash一下 + 归并排序计算逆序对数
- 从归并排序到逆序对数目计算。
- 归并排序计算逆序对数目
- 使用归并排序求解数组逆序对个数
- (使用排序算法进行编程7.3.11)POJ 1007 DNA Sorting(使用冒泡排序算法来计算逆序对)
- 使用ftell函数计算文件的长度
- C#_delegate - Pair<T> & 简单顺序逆序 & 方法委托(在Pair类下)&枚举类型 混搭使用
- 使用计算监控(Using computed observables)
- 股票入门基础知识23:如何计算使用速动比率
- 使用开源Grid平台-GridGain实现网格计算
- 使用Pear的RPN库处理工资计算公式
- CLR_via_C#.3rd 翻译[25.7 使用专用线程执行异步的计算限制操作]
- 【数据实时分析】流计算使用教程
- 开源Math.NET基础数学类库使用(02)矩阵向量计算
- java使用栈实现单词的逆序
- 单链表的使用——计算多项式加法