归并排序:逆序对问题

Posted causewang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序:逆序对问题相关的知识,希望对你有一定的参考价值。

归并排序:逆序对问题

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

代码

#include <stdio.h>

int helperArr[10];

void Merge(int arr[], int l, int mid, int r)
{
    int i = l;
    int p1 = l;
    int p2 = mid + 1;
    while (p1 <= mid && p2 <= r) {
        if (arr[p1] > arr[p2]) {
            for (int j = p2; j <= r; ++j) {
                printf("[%d, %d] ", arr[p1], arr[j]);
            }
        }
        helperArr[i++] = arr[p1] > arr[p2] ? arr[p1++] : arr[p2++];
    }
    while (p1 <= mid) {
        helperArr[i++] = arr[p1++];
    }
    while (p2 <= r) {
        helperArr[i++] = arr[p2++];
    }

    for (; l <= r; l++) {
        arr[l] = helperArr[l];
    }
}

void MergeSort(int arr[], int l, int r)
{
    if (l == r) {
        return;
    }
    int mid = l + ((r - l) >> 1); // =(l+r)/2 因为l+r有可能会溢出,所以改成减法的方式
    MergeSort(arr, l, mid);
    MergeSort(arr, mid + 1, r);
    Merge(arr, l, mid, r);
}

void MergeInversion(int arr[], int size)
{
    if (arr == NULL || size < 2) {
        return;
    }
    return MergeSort(arr, 0, size - 1);
}

void PrintArr(int arr[], int size)
{
    printf("
");
    for (int i = 0; i < size; ++i) {
        printf("%d ", arr[i]);
    }
    printf("
");
}

int main()
{
    int arr[10] = {6, 0, 5, 3, 15, 21, 13, 9, 12, 8};
    PrintArr(arr, 10);
    MergeInversion(arr, 10);
    PrintArr(arr, 10);
    return 0;
}

以上是关于归并排序:逆序对问题的主要内容,如果未能解决你的问题,请参考以下文章

归并排序 逆序对

归并排序&&逆序对(codves1688,4163)

归并排序(归并排序求逆序对数)--16--归并排序--Leetcode面试题51.数组中的逆序对

poj2299--归并排序求解逆序对

归并排序求逆序对

归并排序 之 逆序对