数组中的逆序对

来源:互联网 发布:淘宝女装网红店有哪些 编辑:程序博客网 时间:2024/06/03 17:50

    问题:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7,5,6,4},一共有5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4).

解决问题的思路(归并排序):

int InversePairs(int* data, int length){    if(data == NULL || length < 0)        return 0;    int* copy = new int[length];    for(int i = 0; i < length; ++ i)        copy[i] = data[i];    int count = InversePairsCore(data, copy, 0, length - 1);    delete[] copy;    return count;}//归并排序的思想int InversePairsCore(int* data, int* copy, int start, int end){    if(start == end)    {        copy[start] = data[start];        return 0;    }    int length = (end - start) / 2;    int left = InversePairsCore(copy, data, start, start + length);    int right = InversePairsCore(copy, data, start + length + 1, end);    // i初始化为前半段最后一个数字的下标    int i = start + length;     // j初始化为后半段最后一个数字的下标    int j = end;     int indexCopy = end;    int count = 0;    while(i >= start && j >= start + length + 1)    {        if(data[i] > data[j])        {            copy[indexCopy--] = data[i--];            count += j - start - length;        }        else        {            copy[indexCopy--] = data[j--];        }    }    for(; i >= start; --i)        copy[indexCopy--] = data[i];    for(; j >= start + length + 1; --j)        copy[indexCopy--] = data[j];    return left + right + count;}// ====================测试代码====================void Test(char* testName, int* data, int length, int expected){    if(testName != NULL)        printf("%s begins: ", testName);    if(InversePairs(data, length) == expected)        printf("Passed.\n");    else        printf("Failed.\n");}void Test1(){    int data[] = {1, 2, 3, 4, 7, 6, 5};    int expected = 3;    Test("Test1", data, sizeof(data) / sizeof(int), expected);}// 递减排序数组void Test2(){    int data[] = {6, 5, 4, 3, 2, 1};    int expected = 15;    Test("Test2", data, sizeof(data) / sizeof(int), expected);}// 递增排序数组void Test3(){    int data[] = {1, 2, 3, 4, 5, 6};    int expected = 0;    Test("Test3", data, sizeof(data) / sizeof(int), expected);}// 数组中只有一个数字void Test4(){    int data[] = {1};    int expected = 0;    Test("Test4", data, sizeof(data) / sizeof(int), expected);}// 数组中只有两个数字,递增排序void Test5(){    int data[] = {1, 2};    int expected = 0;    Test("Test5", data, sizeof(data) / sizeof(int), expected);}// 数组中只有两个数字,递减排序void Test6(){    int data[] = {2, 1};    int expected = 1;    Test("Test6", data, sizeof(data) / sizeof(int), expected);}// 数组中有相等的数字void Test7(){    int data[] = {1, 2, 1, 2, 1};    int expected = 3;    Test("Test7", data, sizeof(data) / sizeof(int), expected);}void Test8(){    int expected = 0;    Test("Test8", NULL, 0, expected);}int _tmain(int argc, _TCHAR* argv[]){    Test1();    Test2();    Test3();    Test4();    Test5();    Test6();    Test7();    Test8();    return 0;}


1 0