您的位置:首页 > 其它

使用归并排序计算逆序对个数

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


一个完整的自底向上的归并排序只需要修改两个地方就实现了上述的计算数组中逆序对个数的算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并排序 逆序