编辑代码

#include <stdio.h>

int merge(int arr[], int temp[], int left, int mid, int right)
{
    int i = left;
    int j = mid + 1;
    int k = left;
    int count = 0;

    while (i <= mid && j <= right)
    {
        if (arr[i] <= arr[j])
        {
            temp[k++] = arr[i++];
        }
        else
        {
           
            count += (mid - i + 1);
            temp[k++] = arr[j++];
        }
    }

    while (i <= mid)
    {
        temp[k++] = arr[i++];
    }
    while (j <= right)
    {
        temp[k++] = arr[j++];
    }

    int x;
    for (x = left; x <= right; x++)
    {
        arr[x] = temp[x];
    }

    return count;
}

int mergeSort(int arr[], int temp[], int left, int right)
{
    int count = 0;

    if (left < right)
    {
        int mid = (left + right) / 2;
        // 递归地计算左半部分和右半部分的逆序对数目
        count += mergeSort(arr, temp, left, mid);
        count += mergeSort(arr, temp, mid + 1, right);
        // 合并两个子数组并计算逆序对数目
        count += merge(arr, temp, left, mid, right);
    }
    return count;
}

int main()
{
    int arr[] = {2, 4, 3, 1, 5, 6};
    int arrLen = sizeof(arr) / sizeof(arr[0]);
    int temp[arrLen];
    int count = mergeSort(arr, temp, 0, arrLen - 1);
    printf("逆序对个数为: %d\n", count);

    return 0;
}