逆序数的定义,摘自百度百科:
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。如2431中,21,43,41,31是逆序,逆序数是4,为偶排列。
我是在看算法导论的时候,看到合并排序的课后习题有一个逆序数,要求是在O(nlgn)的时间复杂度之内查找出来。最直接的算法就是双重循环,类似于冒泡排序法,对整个数组进行外循环,内循环是将外循环的下标所指向的元素与内循环指向元素比较,如果外循环的大于内循环的则++,最后得出逆序数。
但是书上给的提示是在合并排序的基础上该,当时想的分解倒是很容易理解,分为两部分,但是他要在第三步(就是合并排序算法的合并函数)统计出当次合并的逆序数目,脑袋就昏了。主要当时只想到分解,分解后合并。并没有认识到,题目潜在的意思是让你利用合并排序那种合并的时候合并出顺序的思想。弱弱...
大致的思路就比较简单,在合并的时候,如果后半部分的数组的元素小于前面的元素,则将计数器加他跳过前半部分的元素,也就是说加上他比前半部分多少个元素大,然后每次合并后的都是一个已排序的数组。
代码如下:
merge.c合并并统计这次合并的逆序数
merge.h
reveser_number.c
有一点需要在merge.c计数的时候注意一下,加的时候加的是q-p-j个元素,就是数组的长度减去已插入到数组中的元素个数,就是剩下的左边的数组的元素个数。
分享到:
相关推荐
利用归并排序求逆序数,复杂度在O(nlgn)含测试用例
求逆序数的方法很多。最容易想到的办法是分别对序列中每一个元素求其逆序数,再求所有元素的逆序数总和,易分析得出这样的方法其时间复杂度为O(n2)。而这里采用的分治法求逆序数,其时间复杂度为O(nlogn)。
一个C程序 实现了单链表的逆序 且复杂度为O n
设A[1..n]是包含n个不同数的数组,如果i而且A[i]>A[j],则(i,j)为一个逆序组,给出时间复杂度为nlgn算法,确定n个任意元素排列中逆序组的个数。
有一实数序列a1,a2,....an,若i且ai>aj,则(ai,aj)形成了一个逆序对,请使用分治算法求整个序列中逆序对个数,并分析算法时间复杂度。
逆序数c++源码,直接运行
测试输入的数组中有多少个逆序对,本程序在归并排序的基础上实现,时间复杂度为O(nlgn)
逆序输出数字.cpp逆序输出数字.cpp逆序输出数字.cpp逆序输出数字.cpp逆序输出数字.cpp逆序输出数字.cpp逆序输出数字.cpp逆序输出数字.cpp逆序输出数字.cpp逆序输出数字.cpp逆序输出数字.cpp逆序输出数字.cpp逆序输出...
堆排序 归并排序 选择排序 快速排序 插入排序 可选择数组初始状态(随机、正序、逆序) 通过输出的时间可以更好地比较在不同数组状态下 各种排序算法的时间复杂度
算法导论 课上的 用mergesort求逆序数对的matlab源码,想挣点分,所以就不免费下载了~~~~ 见谅
解决逆序数问题汉诺塔问题最合数亲和书等一系类问题
逆序数
归并排序求逆序数
利用归并排序实现关于逆序数的计算,Java程序
逆序数字
求输入数据后求逆序数问题。常用于本科,研究生的算法作业。里面是工程文件,可以直接使用。
采用归并排序的方法来就算一个序列总的逆序数
学习电脑信息用while循环获得逆序数
行业分类-设备装置-一种FFT和IFFT逆序数表的并行处理方法
北大POJ1804-Brainman【借助Mergesort求逆序数O(nlogn)】