/******************************************************************
题目:在数组中的两个数字如果前面的一个数字大于后面的数字,则这两个
数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
*******************************************************************/
/*
解题思路:
先把数组分隔成子数组,先统计子数组内部的逆序对的数目,然后再统计出两个
相邻子数组之间的逆序对的数目。在统计逆序对的过程中,还需要读数组进行排
序。如果对排序算法很熟悉,我们不难发现这个排序的过程实际上就是归并排序。
*/
#include<stdio.h>
int inversePair(int* data, int* copy, int start, int end);
int inversePair(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 start = 0;
int end = length - 1;
int count = inversePair(data, copy, start, end);
return count;
}
int inversePair(int* data, int* copy, int start, int end)
{
if(start == end)
{
copy[start] = data[start];
return 0;
}
int midIndex = (start + end)/2;
int left = inversePair(data,copy,start,midIndex);
int right = inversePair(data,copy,midIndex+1,end);
//归并
int index1 = start;
int index2 = midIndex+1;
int index = start;
int count = 0;
while(index1 <= midIndex && index2 <= end)
{
if(data[index1]<data[index2])
copy[index++] = data[index1++];
else
{
copy[index++] = data[index2++];
count += midIndex - index1 + 1;
}
}
while(index1 <= midIndex)
copy[index++] = data[index1++];
while(index2 <= end)
copy[index++] = data[index2++];
//for(int i=0;i<index;i++) //必须将数组赋值放在这里,否则会导致排好的数列又复原
// data[i] = copy[i];
//返回数值
return left+right+count;
}
void test()
{
const int length = 6;
int arr[length] = {6, 5, 4, 3, 2, 1};
printf("%d\n",inversePair(arr,length));
}
int main()
{
test();
return 0;
}
/*书上的答案
int InversePairsCore(int* data, int* copy, int start, int end);
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;
}
*/
分享到:
相关推荐
统计数组中的逆序对的个数,基于归并排序的思想,先拆分为单个元素,再合并为两个元素的数组,组内统计后,排序,进行组建统计
java基础面试题数组中逆序对本资源系百度网盘分享地址
设A[1..n]是包含n个不同数的数组,如果i而且A[i]>A[j],则(i,j)为一个逆序组,给出时间复杂度为nlgn算法,确定n个任意元素排列中逆序组的个数。
(2)插入排序的运行时间和数组中逆序对的个数有关系吗?什么关系? 输入格式 第一行:n,表示接下来要输入n个元素,n不超过10000。 第二行:n个元素序列。 输出格式 逆序对的个数。 输入样例 5 2 3 8 6 1 ...
逆序数c++源码,直接运行
广工《算法和高级数据结构教程》 逆序对(树状数组) c语言实现
主要为大家详细介绍了java实现数组中的逆序对,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
将一个数组逆序输出,用第一个与最后一个交换。 #!/usr/bin/python # -*- coding: UTF-8 -*- if __name__ == '__main__': a = [9,6,5,4,1] N = len(a) print a for i in range(len(a) / 2):
算法-数组逆序重存放(信息学奥赛一本通-T1105).rar
数组中的逆序对.md
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= 数组长度 <= 50000 首先最...
此程序是课程学习中的数组逆序,希望对大家有帮助
给你m个整数,将其逆序输出 输入 第一行一个整数m(3 ):数的个数 第二行m个整数(空格隔开)(这些数在0-9999999之间) 输出 m个整数(空格隔开
先要创建一个新数组 newArray[],要求新数组中的元素与原数组逆序,并且如果原数组中的元素值小于0,在新数组中按0存储。试编程输出新数组 中的元素,程序运行结果如下: 原数组为:1,3,-1,5,-2 逆序并处理后的数组为...
将数组中的数逆序排放
C语言程序设计-编写函数fun将一个数组中的值按逆序存放,并在main()函数中输出;例如:原来存顺序为8,6,5,4,1;要求改为:1,4,5,6,8;.c
C语言——借助指针实现数组元素的逆序.zip
C语言的数组逆序,很实用的,可以下载试试,哈哈哈哈哈哈哈
数组中的逆序对在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。示例 1:输入: [7,5,6,4]输出: 5限制:0 数组