数组中逆序对的数量是同运行插入排序产生的移动的数量是相同的,但是选择排序的最差的时间复杂度是n的平方次,但是合并排序最差的是nlogn的时间复杂度。所以应该修改合并排序来计算逆序对数量。在L和R合并的过程中,如果没有移动的话,序列是L+R,所以计算移动的数量就是元素没有移动过R与L与R合并后的位置之间的差值就是移动的数量。
以下代码是实现的算法:
-
#include<iostream>
-
constintMAXINT=0xFFFF-1;
-
voidInversionMerge(intA[],intstart,intmid,intend,int&c)
- {
-
intlen1=mid-start+1+1;
-
intlen2=end-mid+1;
-
int*L=newint[len1];
-
int*R=newint[len2];
-
for(inti=0;i<len1-1;i++)
- L[i]=A[start+i];
- L[len1-1]=MAXINT;
-
for(intj=0;j<len2-1;j++)
- R[j]=A[mid+j+1];
- R[len2-1]=MAXINT;
- i=0;j=0;
-
for(intk=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++;
- }
- }
- }
-
voidInversionMergeSort(intA[],intstart,intend,int&c)
- {
-
if(start<end)
- {
-
intmid=(end+start)/2;
- InversionMergeSort(A,start,mid,c);
- InversionMergeSort(A,mid+1,end,c);
- InversionMerge(A,start,mid,end,c);
- }
- }
-
intmain(void)
- {
-
int*a;
-
intc=0;
-
intn;
-
std::cout<<"Pleaseinputthearray'ssize:/n";
- std::cin>>n;
-
a=newint[n];
-
std::cout<<"Pleaseinputthearray'value:"<<std::endl;
-
for(inti=0;i<n;i++)
- std::cin>>a[i];
- InversionMergeSort(a,0,n-1,c);
-
std::cout<<"Thesortednumberseries:";
-
for(i=0;i<n;i++)
-
std::cout<<""<<a[i];
- std::cout<<std::endl;
-
std::cout<<"theInversionNumberIs"<<c<<std::endl;
-
return0;
- }
答案经检验是正确的,开心!
分享到:
相关推荐
标题中的"O(nlgn)"算法表明我们关注的是一个时间复杂度为n对数n的解决方案,这通常意味着我们正在讨论一种高效的算法。 第一个文件《电路布线问题的一种推广及其算法》可能探讨了电路布线问题的扩展形式,可能是...
设A[1..n]是包含n个不同数的数组,如果i而且A[i]>A[j],则(i,j)为一个逆序组,给出时间复杂度为nlgn算法,确定n个任意元素排列中逆序组的个数。
测试输入的数组中有多少个逆序对,本程序在归并排序的基础上实现,时间复杂度为O(nlgn)
先建立具有n个结点的平衡二叉树,在建树的过程中记录每个结点的次序,然后用求余运算计算所查找的结点的位置,输出该结点元素,并删除,如此直到输出最后一个元素。由于向平衡二叉树中插入的元素本身就是单调递增...
利用归并排序求逆序数,复杂度在O(nlgn)含测试用例
在本案例中,我们关注的是C++实现的最近点对算法,其基于《离散数学及其应用》一书中的描述,并具有nlgn的时间复杂度,即线性对数时间复杂度,这是优化过的解决方案,相比简单的平方根搜索有了显著的效率提升。...
输入序列,求最长上升子序列的长度,算法复杂度nlgn
"O(nlgn)"是描述Delaunay三角剖分算法的时间复杂度,表示在最坏情况下,算法所需操作与输入点的数量n的对数成线性关系。这是通过使用高级数据结构如平衡二叉搜索树或者平面分割技术实现的。在实际应用中,这样的效率...
线性时间排序是指在处理数据时...虽然比较排序无法突破O(nlgn)的时间复杂度下界,但非比较排序如计数排序提供了在特定条件下实现线性时间复杂度排序的可能性。在实际应用中,选择哪种排序算法取决于数据的特性和需求。
4. 线性对数阶 O(nlog2n):算法执行时间在问题规模的线性和对数之间。 5. 平方阶 O(n^2):例如,两层循环嵌套,执行时间与问题规模的平方成正比。 6. 立方阶 O(n^3):三层循环嵌套,执行时间与问题规模的立方成正比...
HEAP-SORT:对数组进行原址排序,其时间复杂度为θ(nlgn)。 在堆的基础上实现优先队列INSERT、MAXMUM、EXTRACT-MAX、INCREASE-KEY操作,时间复杂度为θ(lgn)。 本文档详细讲述了两种算法的设计和实现,分别是归并...
快速排序是实际运用中用的最多的算法,虽然它在最坏的情况下会达到n^2,但它的平均性能非常好,期望时间复杂度为nlgn,而且隐含的常数因子非常小,并且是原址排序。 快速排序原理:从一组数中任意选出一个数,将...
从图一中我们可以看到,任意一组整型数组分别采用三种算法在运行时间上的差别不大;最省时间的是确定型算法,其次是随机基准快速排序算法,最后是随机化输入快速排序算法;后面两个算法较之确定型算法要费时的原因是...
Java-德劳内三角剖分一个基于gui的简单Java应用程序,它在O(nlgn)中的二维点集上计算Delaunay三角剖分。 在数学和计算几何学中,平面中一组P点的Delaunay三角剖分是DT(P)三角剖分,因此P中的任何点都不在DT(P)...
根据平均时间复杂度,可以将排序算法分为四类:平方阶 O(n^2) 排序、线性对数阶 O(nlgn) 排序、O(n^m) 排序和线性阶 O(n) 排序。 * 平方阶 O(n^2) 排序:包括直接插入排序、选择排序、冒泡排序等,这类排序算法的...
时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶变换FFT实现了大整数乘法。时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶变换FFT实现了大整数乘法。时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶...
基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置。 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边。 1. 3 InsertionSort:每次拿起...
线性时间排序是一种高效排序方法,主要关注在特定条件下能够达到线性时间复杂度的排序算法。本章重点讲解了四种线性时间排序算法:计数排序、基数排序、桶排序,以及在平均情况和最坏情况下的比较排序算法。 首先,...
总结来说,这些内容涵盖了归并排序的优化、组合数学的对数关系、以及递归算法的时间复杂度分析,这些都是算法导论课程的核心主题,对于理解算法的效率和设计具有重要意义。通过深入学习和掌握这些知识点,可以提升在...