使用归并排序计算逆序对个数
来源:互联网 发布:阿里云 应用服务引擎 编辑:程序博客网 时间:2024/04/29 23:26
- 给出一个数组 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 = 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: 21Process finished with exit code 0
- 一个完整的自底向上的归并排序只需要修改两个地方就实现了上述的计算数组中逆序对个数的算法。
阅读全文
0 0
- 使用归并排序计算逆序对个数
- 使用归并排序求解数组逆序对个数
- (应用排序算法编程7.2.2)POJ 2299 Ultra-QuickSort(使用归并排序来计算逆序对的个数)
- 归并排序与逆序对的个数
- 归并排序求逆序对的个数
- 归并排序求逆序对个数
- 归并排序--逆序数对的计算
- 归并排序计算逆序对数目
- [笔记]利用归并排序计算逆序数的个数
- 逆序对 归并排序
- 归并排序 & 逆序对
- 归并排序--逆序对
- 利用归并排序求数列中逆序对个数
- POJ 2299 求逆序对个数 归并排序 Or数据结构
- Ultra-QuickSort(归并排序求逆序对的个数)
- 从归并排序到逆序对数目计算。
- 归并排序&归并排序求逆序对
- 归并排序求逆序对
- 52数学能力测评第二阶段测评考试时间(2018年度)
- Autoencoder 详解
- Android 超简单音乐播放器(十)歌词的实现
- 取时间最大的一条记录
- 设置图片轮流滑动播放的效果——学习笔记
- 使用归并排序计算逆序对个数
- Freemarker
- .md即markdown文件的基本常用编写语法(图文并茂)
- Spring学习笔记7
- SQL中的CASE WHEN用法
- 实现wordpress面包屑导航的功能
- eclipse 代码提示黑色的处理办法
- C++ auto_ptr智能指针的用法
- JavaScript 【某宝某东 360 度 3D 旋转展示商品主图实现】