算法题目---数组中的逆序对
2017-08-01 09:09
295 查看
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
输入一个数组,求出这个数组中的逆序对的总数。
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);
int i = start +length;
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;
}
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;
}
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 main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
return 0;
}
输入一个数组,求出这个数组中的逆序对的总数。
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);
int i = start +length;
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;
}
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;
}
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 main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
return 0;
}
相关文章推荐
- 【算法题目】数组中的逆序对
- 【程序31】 题目:将一个数组逆序输出。
- 算法题目---数组只出现一次数字
- 【剑指Offer面试编程题】题目1348:数组中的逆序对--九度OJ
- 【算法】各大公司笔试题目之数组相关笔试题
- 《算法》逆序数组,选择排序和插入排序谁更快
- 算法题目---数字在排序数组中出现的次数
- 【剑指Offer面试编程题】题目1348:数组中的逆序对--九度OJ
- 面试算法(三十六)数组中的逆序对
- [Jobdu] 题目1348:数组中的逆序对
- 逆序对的两种算法【树状数组 / 归并排序】
- 【算法】逆序对问题的四种解法(归并排序,BST,树状数组,线段树)及变形
- 题目2.给出一个算法,它能用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目
- 积跬步至千里——算法强化训练(1)统计数组中的逆序对
- JAVA利用冒泡排序构思出的求数组逆序的算法
- 这是一个我面试某公司的算法题目:对一个字符数组进行排序,根据给定的字符,大于它的,放在数组的左边,小于它的,放在数组的右边,且数组中的元素之间的相对位置要保持不变。
- 【剑指offer】题目36 数组中的逆序对
- 【算法导论学习-011】数组中的逆序对个数(Counting inversions in an array)
- 两种数组逆序算法
- JAVA算法题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。