数组中的逆序对
来源:互联网 发布:淘宝女装网红店有哪些 编辑:程序博客网 时间: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
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 搜索引擎技术介绍
- 一周乱弹(1,jquery窗口变化触发的方法。2,Intellij出现 java.lang.OutOfMemory)
- The solution on the Elements of Statistical Learning ( Ex. 8)
- Python数据分析|第2章 引言(例子)
- 使用avilib封装MJPEG数据应用实例
- 数组中的逆序对
- 实现字符串翻转(包含中文汉字)
- 161217
- 数据结构之栈的java实现
- 字符数组和字符串总结
- php中json_encode()在ie浏览器下无法生成对应的json串
- 电商泛滥的时代,我们的出路在哪里?
- 10.9 双坐标轴绘制
- php几个常用的概率算法(抽奖、广告首选)