反转计数给出麻烦(修改合并排序的实现)

时间:2016-06-29 14:04:27

标签: c++ mergesort

考虑到这个问题:

  

给定大小为A的数组N,您需要找到有序数   成对(i, j),以便i < jA[i] > A[j]

     

输入:第一行包含一个整数N,数组大小。第二行包含N空格分隔的整数,表示元素   数组A

     

输出:打印(i, j)i < j的有序对A[i] > A[j]的数量   1 ≤ N ≤ 10^6 1 ≤ A[i] ≤ 10^6

     

约束:

#include <iostream>

using namespace std;

int ar[10000000];
long long counting=0;

void merge(int* ALR, int* L, int left_length, int* R, int right_length) {
    int l = 0;
    int r = 0;
    for (int i = 0; i < left_length + right_length;) {

        if (l == left_length)ALR[i++] = R[r++];
        else if (r == right_length)ALR[i++] = L[l++];
        else if(L[l]>R[r]){
            counting+=(left_length-l);
            ALR[i++]=L[l++];
        }
        else    ALR[i++]=R[r++];

    }
}

void merge_sort(int* ALR, int length) {

    if (length == 1)return;

    int mid = length / 2;

    int* L = new int[mid];
    int* R = new int[length - mid];

    int k = 0;

    for (size_t i = 0; k < mid; i++)L[i] = ALR[k++];
    for (size_t i = 0; k < length; i++)R[i] = ALR[k++];

    merge_sort(L, mid);
    merge_sort(R, length - mid);

    merge(ALR, L, mid, R, length - mid);

    delete(L);
    delete(R);
}
int main() {

     int t;
     cin>> t;

     for(int i=0;i<t;i++)cin>> ar[i];

    merge_sort(ar, t);

  cout<<counting;

 return 0;

}

Source: hackerearth's merge sort tutorial

我遇到了正确实施解决方案的问题。

这是我写的代码:

unset($return['Customer']['Orders']);
unset($return['Status']['Orders']);

现在问题是我在第二个测试用例中得到了错误的答案......

答案应该是: 250194527312

我得到的答案: 250002372570

哪里出错了?

1 个答案:

答案 0 :(得分:1)

您应遵循的一般原则是对小部分代码进行单元测试。在这种情况下,您应该测试合并功能,以查看合并时获得的内容是否正确。如果您编写了一个合并两个非常小的数组的测试,那么您会看到结果按降序排列,并且反转计数通常是错误的。

这是我用于合并排序反转计数的测试用例:

// expect 3 inversions in [1,3,5,2,4,6]

你的实际问题是一个容易犯的错误(翻转比较器并将另一个分支计为反转),并且我保证许多有经验的程序员在运行测试之前会犯一些相同的错误。新手和退伍军人之间的区别在于知道如何找到这些错误(以及结构测试以便自动找到它们)。