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

来源:互联网 发布:阿里云 应用服务引擎 编辑:程序博客网 时间: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
  • 一个完整的自底向上的归并排序只需要修改两个地方就实现了上述的计算数组中逆序对个数的算法。
原创粉丝点击