• 数组中的逆序对


    在数组中的两个数字如果前面一个大于后面的数字,则这两个数字组成一个逆序对,输入一个数组,求出这个数组的逆序对的总数。

    思路:利用变形的归并排序

    #include <iostream>
    using namespace std;
    int inversePairs(int *data, int *buf, int l, int r){
        if (l >= r) return 0;
        //初始化需要的变量,p1指向左子数组的最右,p2指向右子数组的最右
        int count = 0;
        int mid = (l + r) / 2;
        int p1 = mid;
        int p2 = r;
    
        int lPairs = inversePairs(data, buf, l, mid);
        int rPairs = inversePairs(data, buf, mid + 1, r);
        int length = r - l + 1;
        //数据复制到辅助数组
        for (int curr = l; curr <= r; curr ++){
            buf[curr] = data[curr];
        }
        //归并并且排序,注意讨论分支出现的顺序,避免数组操作出界
        for (int curr = r; curr >= l; curr--){
            if (p1<l){
                data[curr] = buf[p2--];
            }else{
                if (p2 < mid + 1){
                    data[curr] = buf[p1--];
                }else{
                    if (buf[p1] > buf[p2]){
                    data[curr] = buf[p1--];
                    count += (p2 - mid);
                    }else{
                        data[curr] = buf[p2--];
                    }
    
                }
                
            }
        }
        return (lPairs + rPairs + count);
    }
    int main(){
    #if 0
        int data[4] = {7,5,6,4};
        int temp[4] = { 0 };
        int myCount = inversePairs(data, temp, 0, 3);
        for (int i = 0; i < 4; i++)
            cout << data[i]<<'	';
        cout << endl;
    
        cout << myCount;
    #endif
        const int num = 6;
        int data[num] = { 6, 2, 3, 6, 5, 0 };
        int temp[num] = { 0 };
        int myCount = inversePairs(data, temp, 0, 5);
        for (int i = 0; i < num; i++)
           cout << data[i] << '	';
        cout << endl;
        cout << myCount;
        system("pause");
    }
  • 相关阅读:
    MySQL max_allowed_packet设置及问题
    centos 7 编译安装mysql 详细过程
    如何快速查看mysql数据文件存放路径?
    centos yum 库更新
    centos 7 ifconfig 命令找不到
    http协议
    前端那些事儿
    C++接口的定义与实现的详细过程
    List转为字符串
    spring cloud spring boot JPA 克隆对象修改属性后 无法正常的执行save方法进行保存或者更新
  • 原文地址:https://www.cnblogs.com/hzmbbbb/p/3980586.html
Copyright © 2020-2023  润新知