【问题标题】:Counting Inversions in an array via merge sort通过归并排序计算数组中的倒数
【发布时间】:2014-12-10 14:07:42
【问题描述】:

Inversion Count 表示数组距离排序的距离(或接近)。如果数组已经排序,则反转计数为0。如果数组以相反的顺序排序,则反转计数为最大值。

#include <iostream>
#include <cstdlib>
using namespace std;

int merge(int arr[],int temp[], int left, int mid, int right)
{
    int inv_count = 0;
    int i = left;
    int j = mid;
    int k = right;
    while((i <= mid-1) && (j <= right))
    {
        if(arr[i] <= arr[j])
        {
            temp[k++] = arr[i++];
        }
        else
        {
            temp[k++] = arr[j++];
            inv_count += (mid - i);
        }
    }
    while(i <= mid-1)
        temp[k++] = arr[i++];
    while(j <= right)
        temp[k++] = arr[j++];
    for(i = left; i <= right; i++)
        arr[i] = temp[i];
    return inv_count;
}

int _merge_sort(int arr[], int temp[], int left, int right)
{
    int mid, inv_count = 0;
    if(right > left)
    {
        mid = (right+left)/2;
        inv_count = _merge_sort(arr,temp,left,mid);
        inv_count += _merge_sort(arr,temp,mid+1,right);
        inv_count += merge(arr,temp,left,mid+1,right);
    }
    return inv_count;
 }

int merge_sort(int arr[], int array_size)
{
    int *temp = (int *)malloc(sizeof(int)*array_size);
    return (_merge_sort(arr,temp,0,array_size-1));
}

int main()
{
    int arr[]= {1, 25, 12, 56, 36, 3, 0, 10, 8, 7};
    for(int i = 0; i < 10; i++)
        cout<<arr[i]<<"\t";
    cout<<"\n";
    cout<<merge_sort(arr,10)<<"\n";
    for(int i = 0; i < 10; i++)
        cout<<arr[i]<<"\t";
    cout<<"\n";
    return 0;
}

给定数组的预期输出是 27,但我得到 6。另外,我的原始数组数据已被修改(未排序的值已更改)。

【问题讨论】:

  • 尝试单步调试调试器,以实际查看运行代码时发生的情况。

标签: c++ arrays algorithm sorting


【解决方案1】:

您需要在函数合并中将 int k = right 替换为 int k = left。我认为这个数组的预期输出是 27。这里讨论了合并排序的各种实现implementing merge sort in C++

【讨论】:

  • 非常感谢。是的,给定数组的预期结果是 27。
猜你喜欢
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多