归并排序:逆序对问题

归并排序:逆序对问题

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

代码

#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("\n");
    for (int i = 0; i < size; ++i) {
        printf("%d ", arr[i]);
    }
    printf("\r\n");
}

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;
}

猜你喜欢

转载自www.cnblogs.com/causewang/p/12064482.html