刷题笔记20——(归并、暴力)打印数组中的逆序对及个数

题目描述

在一个数组中, 左边的数如果比右边的数大, 则折两个数构成一个逆序对, 请打印所有逆序对和个数

解法1:暴力法

刷题笔记20——(归并、暴力)打印数组中的逆序对及个数_第1张图片

解法2:归并法

刷题笔记20——(归并、暴力)打印数组中的逆序对及个数_第2张图片

测试结果及代码

刷题笔记20——(归并、暴力)打印数组中的逆序对及个数_第3张图片

#include 
#include 
#include 
#include 
using namespace std;

const int num = 3;

void printArray(int a[], int N) {
    for (int i = 0; i < N; ++i) {
        cout << a[i] << " ";
    }
    cout << endl;
}

void Swap(int &x, int &y) {
    int t = x;
    x = y;
    y = t;
}

void compare(int a[], int N, int &sum) {
    for (int i = 0; i < N - 1; ++i) {
        for (int j = i + 1; j < N; ++j) {
            if (a[i] > a[j]) {
                cout << "(" << a[i] << ", " << a[j] << ")  ";
                sum++;
            }
        }
    }
}

void Merge(int a[], int left, int mid, int right, int &sum) {
    int i = left;
    int j = mid + 1;
    int nums = right - left + 1;
    int t = 0;
    int *tmp = new int[nums];
    while (i <= mid && j <= right) {
        if (a[i] <= a[j]) {
            tmp[t++] = a[i++];
        } else {
            for (int x = i; x < mid + 1; ++x) {
                cout << "(" << a[x] << ", " << a[j] << ")  ";
            }
            sum += (mid + 1 - i);
            tmp[t++] = a[j++];
        }
    }
    while (i <= mid)
        tmp[t++] = a[i++];
    while (j <= right)
        tmp[t++] = a[j++];

    for (i = 0; i < nums; ++i) {
        a[left + i] = tmp[i];
    }
    delete []tmp;
}

void MergeSort(int a[], int left, int right, int &sum) {
    if (left == right) {
        return;
    }
    int mid = left + ((right - left) >> 1);
    MergeSort(a, left, mid, sum);
    MergeSort(a, mid + 1, right, sum);
    Merge(a, left, mid, right, sum);
}

void test(int a[], int N, int &sum) {
    MergeSort(a, 0, N - 1, sum);
}

bool isEqual(int A[], int B[], int N) {
    for (int i = 0; i < N; ++i) {
        if (A[i] != B[i])
            return false;
    }
    return true;
}

int main (int argc, char* argv[]) {

    srand(time(NULL));
    const int size = 5;           // 随机生成的数组大小
    const int test_time = 20;      // 测试次数
    int a[size] = {0};             // 原始数组
    int tmp1[size] = {0};          // 测试数组
    int tmp2[size] = {0};          // 对比数组
    int tmp3[size] = {0};          // 展示数组

    for (int cnt = 0; cnt < test_time; ++cnt) {
        for (int i = 0; i < size; ++i) {
            a[i] = rand() % 10 + 1;
        }
        for (int i = 0; i < size; ++i) {
            tmp1[i] = a[i];
            tmp2[i] = a[i];
            tmp3[i] = a[i];
        }
        int res1 = 0;
        cout << "\n第 " << cnt << " 次生成:";
        printArray(tmp3, size);
        cout << "第 " << cnt << " 次对比:";
        compare(tmp1, size, res1);
        cout << " 逆序对的个数为:" << res1 << endl;
        // printArray(tmp1, size);
        cout << "第 " << cnt << " 次测试:";

        int res2 = 0;
        test(tmp2, size, res2);
        cout << " 逆序对的个数为:" << res2 << endl;

        // cout << "第 " << cnt << " 次测试:";
        // printArray(tmp2, size);
        cout << endl;
        // if (!isEqual(tmp1, tmp2, size))
        //     cout << cnt <<" : dump" << endl;
    }
    cout << "done";

 
    return 0;
}

你可能感兴趣的:(刷题)