• 算法题12 数组中所有的逆序对


    题目

      求一个数组中所有的逆序对数,如数组arr[]={5,2,4,9,8,6,13,14},逆序对有5,2; 5,4; 9,8; 9,6; 8,6; 逆序对数为5

    分析

      因为数组不是排序的,所以要找一个元素后面所有比它小的数,最直观的想法是依次遍历后续的元素。这样做的时间复杂度为O(n).

      除此之外,涉及两个元素间相互比较的计算在数组的排序算法中最为常见了,归并排序在合并的时候可以记录下对比中的逆序对数:

    代码

     1 int MergeCore(int arr[],int small,int mid,int big,int tmp[])
     2 {
     3     int k=0,i=small,j=mid+1;
     4     int rever_num=0;
     5     while (i<=mid&&j<=big)
     6     {
     7         if (arr[i]<=arr[j])
     8         {
     9             tmp[k++]=arr[i++];
    10         }else
    11         {
    12             tmp[k++]=arr[j++];
    13             rever_num++;
    14         }
    15     }
    16 
    17     while (i<=mid)
    18     {
    19         tmp[k++]=arr[i++];
    20     }
    21     while (j<=mid)
    22     {
    23         tmp[k++]=arr[j++];
    24     }
    25 
    26     for (int n=0;n<k;n++)
    27     {
    28         arr[n+small]=tmp[n];
    29     }
    30 
    31     return rever_num;
    32 }
    33 
    34 void MergeSort(int arr[],int s,int e,int tmp[],int& reverse_num)
    35 {
    36     if (s==e)
    37     {
    38         return;
    39     }
    40     int mid=s+(e-s)/2;
    41     MergeSort(arr,s,mid,tmp,reverse_num);
    42     MergeSort(arr,mid+1,e,tmp,reverse_num);
    43     reverse_num+=MergeCore(arr,s,mid,e,tmp);
    44 
    45 }
    46 
    47 int ReversePairNum(int arr[],int len)
    48 {
    49     if (arr==NULL||len<=0)
    50     {
    51         return -1;
    52     }
    53 
    54     int* tmp=new int[len];
    55     int reverse_num=0;
    56     MergeSort(arr,0,len-1,tmp,reverse_num);
    57 
    58     for (int i=0;i<len;i++)
    59     {
    60         cout<<arr[i]<<endl;
    61     }
    62 
    63     delete[] tmp;
    64     return 0;
    65 }
  • 相关阅读:
    1837. Isenbaev's Number(floyd)
    1414. Astronomical Database(STL)
    1067. Disk Tree(字符串)
    1682. Crazy Professor(并查集)
    1650. Billionaires(线段树)
    1316. Electronic Auction(树状数组)
    1701. Ostap and Partners(并查集-关系)
    大数字运算——2、BigDecimal
    大数字运算——1、BigInteger
    java中的访问修饰符2
  • 原文地址:https://www.cnblogs.com/wangzaizhen/p/5177702.html
Copyright © 2020-2023  润新知