在nlgn时间内实现逆序对数的计算
2008-10-25 11:05
253 查看
数组中逆序对的数量是同运行插入排序产生的移动的数量是相同的,但是选择排序的最差的时间复杂度是n的平方次,但是合并排序最差的是nlogn的时间复杂度。所以应该修改合并排序来计算逆序对数量。在L和R合并的过程中,如果没有移动的话,序列是L+R,所以计算移动的数量就是元素没有移动过R与L与R合并后的位置之间的差值就是移动的数量。
以下代码是实现的算法:
#include <iostream>
const int MAXINT=0xFFFF-1;
void InversionMerge(int A[], int start, int mid, int end,int &c)
{
int len1 = mid-start+1+1;//加一个位置用于保存哨兵
int len2 = end-mid+1;//加一个位置用于保存哨兵
int *L =new int[len1];
int *R =new int[len2];
for(int i=0;i<len1-1;i++)
L[i]=A[start+i];
L[len1-1]=MAXINT;
for(int j=0;j<len2-1;j++)
R[j]=A[mid+j+1];
R[len2-1]=MAXINT;
i=0;j=0;
for(int k=start;k<=end;k++)
{
if(L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
c=c+((mid+1+j)-k);
j++;
}
}
}
void InversionMergeSort(int A[], int start, int end,int &c)
{
if(start<end)
{
int mid = (end +start)/2;
InversionMergeSort(A,start,mid,c);
InversionMergeSort(A,mid+1,end,c);
InversionMerge(A,start,mid,end,c);
}
}
int main(void)
{
int *a;
int c=0;//保存逆序对数量
int n;
std::cout<<"Please input the array's size: /n";
std::cin>>n;
a=new int
;
std::cout<<"Please input the array' value: "<<std::endl;
for(int i=0;i<n;i++)
std::cin>>a[i];
InversionMergeSort(a,0,n-1,c);
std::cout<<"The sorted number series: ";
for(i=0;i<n;i++)
std::cout<<" "<<a[i];
std::cout<<std::endl;
std::cout<<"the Inversion Number Is "<<c<<std::endl;
return 0;
}
答案经检验是正确的,开心!
以下代码是实现的算法:
#include <iostream>
const int MAXINT=0xFFFF-1;
void InversionMerge(int A[], int start, int mid, int end,int &c)
{
int len1 = mid-start+1+1;//加一个位置用于保存哨兵
int len2 = end-mid+1;//加一个位置用于保存哨兵
int *L =new int[len1];
int *R =new int[len2];
for(int i=0;i<len1-1;i++)
L[i]=A[start+i];
L[len1-1]=MAXINT;
for(int j=0;j<len2-1;j++)
R[j]=A[mid+j+1];
R[len2-1]=MAXINT;
i=0;j=0;
for(int k=start;k<=end;k++)
{
if(L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
c=c+((mid+1+j)-k);
j++;
}
}
}
void InversionMergeSort(int A[], int start, int end,int &c)
{
if(start<end)
{
int mid = (end +start)/2;
InversionMergeSort(A,start,mid,c);
InversionMergeSort(A,mid+1,end,c);
InversionMerge(A,start,mid,end,c);
}
}
int main(void)
{
int *a;
int c=0;//保存逆序对数量
int n;
std::cout<<"Please input the array's size: /n";
std::cin>>n;
a=new int
;
std::cout<<"Please input the array' value: "<<std::endl;
for(int i=0;i<n;i++)
std::cin>>a[i];
InversionMergeSort(a,0,n-1,c);
std::cout<<"The sorted number series: ";
for(i=0;i<n;i++)
std::cout<<" "<<a[i];
std::cout<<std::endl;
std::cout<<"the Inversion Number Is "<<c<<std::endl;
return 0;
}
答案经检验是正确的,开心!
相关文章推荐
- 算法初级01——认识时间复杂度、对数器、 master公式计算时间复杂度、小和问题和逆序对问题
- 分治算法题:nlgn时间复杂度计算原序列的重要逆序个数
- 求逆序对数的一种时间复杂度为nlgn的算法
- SPCAMLEditor使用系列(3)--利用SPCamlEditor实现 时间字段跟当前时间进行实时比较计算
- 实现两个时间之间C#时间间隔计算
- 实现内容的时间交集计算的sql语句
- 利用归并排序法计算一个序列里有多少逆序对数(详细讲解)
- 【一个批量计算的调度系统的设计与实现】如果需要对成千上万的网络抓包数据文件在规定的时间内进行解析,应该怎么做?
- python实现中缀表达式计算,实现指数和对数
- 大数据IMF传奇行动绝密课程第97课:使用SparkStreaming+SparkSQL实现在线动态计算出特定时间窗口
- C 数据结构 大中小三种轮渡计算过河时间问题实现
- 网页中实现一个计算当年还剩多少时间的倒数计时程序,要求网页上实时动态显示“××年还剩××天××时××分××秒”
- strcpy()实现,计算任一时刻下一秒时间
- 实现新浪微博中多少时间前,时间计算
- jq、js实现字符串转换日期计算时间差
- 计算逆序对数
- javascript 网页中实现一个计算当年还剩多少时间的倒数计时程序
- 网页中实现一个计算当年还剩多少时间的倒数计时程序,要求网页上实时动态显示“××年还剩××天××时××分××秒”
- 运用Javascript实现时间重置、进行时间加减计算
- 时间段连续判断,实现内容的时间交集计算的sql语句