寻找无序数组中的全部降序对

来源:互联网 发布:淘宝号为什么被冻结 编辑:程序博客网 时间:2024/06/15 02:09

点:巧用归并排序思维


题意:如数组[10,3,15,11,13,1,5,19,2,5,8,7,23,20],寻找其中全部的降序对,所谓降序对,就是数组中,某个位置靠前的数字比某个位置靠后的数字大,比如10在3的前面但是比3大,那么[10,3]就是一个降序对,目的就是寻找全部的降序对。

剑指offer面试题36


思路:非常直观的办法是,从第一个数开始,遍历其后面的数,相当于冒泡排序。这个时间复杂度为O(N)

    这个办法虽然可行,但在面试时肯定不行的。


利用归并排序特点,形成一个个的小组,再不断判断是否形成了逆序对即可。

下面是一个简单的解法。不适用仅统计逆序对个数。


代码:

#include <iostream>#include <random>void Find_reverse_pairs (int *data, int st1, int ed1, int st2, int ed2) {    for (int i = st1; i <= ed1; i++) {        for (int j = st2; j <= ed2; j++) {            if (data[i] > data[j]) {                std::cout << "detect " << data[i] << "," << data[j] << "\t";            }        }    }}void Find (int *data, int size, int st, int ed) {    if (st == ed) {        return;    }    int mid = (st + ed)/2;    Find(data, size, st, mid);    Find(data, size, mid + 1, ed);    Find_reverse_pairs(data, st, mid, mid + 1, ed);}void find_reverse_pair_in_array (int *data, int size) {    Find(data, size, 0, size - 1);    std::cout << std::endl;} int main () {    std::random_device rd;    int data[10], tmp[10];    for (int i = 0; i < 10; i++) {        int cur = rd() % 100;        data[i] = cur;        tmp[i] = cur;        std::cout << cur << "\t";    }    std::cout << std::endl;    find_reverse_pair_in_array(tmp, sizeof(data)/sizeof(data[0]));    return 0;}