广告合作
  • 今日头条

    今日头条

  • 百度一下

    百度一下,你就知道

  • 新浪网

    新浪网 - 提供新闻线索,重大新闻爆料

  • 搜狐

    搜狐

  • 豆瓣

    豆瓣

  • 百度贴吧

    百度贴吧——全球领先的中文社区

  • 首页 订阅工具 订阅

    逆序数怎么算?

    来源:网络收集  点击:  时间:2025-04-17
    【导读】:

    计算一个排列的逆序数的直接方法是逐个枚举逆序,同时统计个数。例如在序列 {2,4,3,1}中,逆序依次为(2,1),(4,3),(4,1),(3,1),因此该序列的逆序数为4。

    下面这个VisualBasic6.0编写的示例使用的就是直接计数的方法,函数NiXushu返回一个字符串的逆序数。

    PrivateFunctionNiXuShu(ByVallAsString)AsLong逆序数计算

    DimiAsInteger,jAsInteger,cAsLong

    Dimn()AsInteger

    ReDimn(Len(l))

    Fori=1ToLen(l)

    n(i) =Val(Mid(l,i,1))

    For j=1Toi-1

    If n(i)n(j)Then

    c=c+1

    EndIf

    Nextj

    Nexti

    NiXuShu=c

    EndFunction

    逆序数归并排序

    直接计数法虽然简单直观,但是其时间复杂度是O(n)。一个更快(但稍复杂)的计算方法是在归并排序的同时计算逆序数。下面这个C++编写的例子演示了计算方法。函数 mergeSort() 返回序列的逆序数。

    int is1,is2;// is1为原数组,is为临时数组,n为个人定义的长度

    long merge(int low,int mid,int high)

    int i=low,j=mid+1,k=low;

    long count=0;

    while(i=midj=high)

    if(is1=is1)// 此处为稳定排序的关键,不能用小于

    is2=is1;

    else

    is2=is1;

    count+=j-k;// 每当后段的数组元素提前时,记录提前的距离

    while(i=mid)

    is2=is1;

    while(j=high)

    is2=is1;

    for(i=low;i=high;i++)// 写回原数组

    is1=is2;

    return count;

    long mergeSort(int a,int b)// 下标,例如数组int is,全部排序的调用为mergeSort(0,4)if(a<b)

    int mid=(a+b)/2;

    long count=0;

    count+=mergeSort(a,mid);

    count+=mergeSort(mid+1,b);

    count+=merge(a,mid,b);

    return count;

    return 0

    本文关键词:

    版权声明:

    1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。

    2、本站仅提供信息发布平台,不承担相关法律责任。

    3、若侵犯您的版权或隐私,请联系本站管理员删除。

    4、文章链接:http://www.1haoku.cn/info/1614450646844981387.html

    相关分类

    相关资讯

    ©2019-2020 http://www.1haoku.cn/ 国ICP备20009186号07-23 04:16:48  耗时:0.040