分治方法实现求一个数组的逆序数
(2012-10-26 20:33:19)
标签:
分治算法逆序数c语言 |
输入:一个一维整型数组,数组大小为n
输出:这个数组的所存的数列的逆序数
要求:可以处理相等的数值
分析:这个问题很容易解决,最简单的方法是:依次求这个数组中每一个数的逆序数,这种方法的时间负责度是O(n*n)。我们探讨效率更高一点的方法,用分治法解决这个问题,可以将时间负责度降低至O(n*log(n))。
分治方法解决这个题目的思路是:首先求前n/2个数的逆序数,然后求后n/2个数的逆序数,最后在排序的过程中合并前后两部分之间的逆序数。
此问题分治方法的边界条件是:当子数列只有一个元素时,将它的逆序数设置为0;
此问题分治方法用递归方法实现,递归的次数为O(log(n)),每个递归中合并前后两部分子数列的时间复杂度是O(n)。在O(n)时间内合并前后两个子数列,并调整其中各个元素的逆序数,用到以中比较巧妙的方法。下面的程序中理解逆序数是这样的:假如一个数的逆序数为m,则表示它后面有m个按顺序应该在它前面的数。
下面的C语言代码可供参考:
#include
#include
/* 数组a是存储原始数列的数组,数组a_temp是为了排序而设置的辅助数组,数组inverse_num用来存储对应原始数列数组中每个元素的逆序数(m个比自己小的数排到了自己的后面),inverse_num_temp是为了响应排序时的元素位置调整而设置的逆序数数组的辅助数组,b表示需要求逆序数的数组内的范围的起点(begin),e表示需要求逆序数的数组内的范围的终点(end)。
void inverse_numbers(int* a,int* a_temp,int* inverse_num,int*
inverse_num_temp,int b,int e)
{