• 数组中的逆序对(归并排序的灵活运用)


    这个题目如果没有限制你的时间复杂度,那么它的在O(n2) 里面完成的话, 那么就很简单 了。
    但是如果发求你在O(n)的时间复杂度里面完成。那么这还是有点挑战性的。
    题目的分析:对于逆序对的理解

    先看方法:

    如上面的所示,对于该算法以,我们首先将数组划分成一个一个的数字(为了排序),然后拆分成了
    两个己排好序的数组。
    那么如何计数逆序对呢?

    如上图在(a)图中:
    是两个排好序的数组,一个是5,7,另一个是4,6.
    我们用两个指针P1和P2,一个指向左边那么数组的未尾,一个指向右边那么数组的未尾。
    于是我们比较P1和P2所指向的这两个数,由于P1指向的数大于P2指向的数,又由于我们右
    边的那个数组是从小到大排好序的,于是逆序数就是P2加它左边的数=2了。然后我们将
    P1指向的数放入辅助数组中,用P3指示。P1左移一位。P2保持不动
    (b)图中:
        由于P1比P2小,因此此时P2指向的数无用了。因为P1应该是在左边的数组中属于最大的了
    于是将P2指向的数复制到P3。然后将P2左移一位。
    (C)图中:
        和(a) 图相似了。

    1. #ifndef INVERT_DATA_COUNT_H
    2. #define INVERT_DATA_COUNT_H
    3. #include<iostream>
    4. int invertPairCore(int *arr,int *copy,int start,int end);
    5. int invertDataPairCount(int *arr,int Length);
    6. int invertDataPairCount(int *arr,int Length){
    7. if(arr==NULL||Length==0){
    8. return 0;
    9. }
    10. int *copy=new int[Length];
    11. /*
    12.         for(int i=0;i<Length; i++){
    13.     copy[i]=arr[i];
    14.     }
    15.     */
    16. int InverpairCountSum=invertPairCore(arr,copy,0,Length-1);
    17. delete[] copy;
    18. return InverpairCountSum;
    19. }
    20. int invertPairCore(int *arr,int *copy,int start,int end){
    21. if(start==end){
    22. copy[start]=arr[start];
    23. return 0;
    24. }
    25. int mid=(end-start)/2; //相当于归并排序,先排好序,分成两组
    26. int leftInvertPair=invertPairCore(arr,copy,start,start+mid);
    27. int rightInvertPair=invertPairCore(arr,copy,start+mid+1,end);
    28. int i=start+mid;
    29. int j=end;
    30. int indexCopy=end;
    31. int pairCount=0;
    32. //核心步骤,和图解差不多的意思。
    33. while(i>=start&&j>=start+mid+1){
    34. if(arr[i]>arr[j]){
    35. copy[indexCopy--]=arr[i--];
    36. pairCount+=j-(start+mid+1)+1;
    37. }else{
    38. copy[indexCopy--]=arr[j--];
    39. }
    40. }
    41. //对剩下的数的处理,也就是在两数组比较的时候还有剩下数据拷贝到copy数组中。
    42. for(;i>=start; --i){
    43. copy[indexCopy--]=arr[i];
    44. }
    45. for(; j>=start+mid+1; --j){
    46. copy[indexCopy--]=arr[j];
    47. }
    48. //返回值。
    49.     return pairCount+leftInvertPair+rightInvertPair;
    50. }
    51. #endif
    1. #include"invertDataCount.h"
    2. int main(){
    3. int arr[4]={7,5,6,4};
    4. std::cout<<invertDataPairCount(arr,4);
    5. }












  • 相关阅读:
    Objective-C之Protocol
    Objective-C之集合对象的内存管理
    IOS的UI基础02
    IOS之UIImageView--小实例项目--带音效的拳皇动画
    IOS的UI基础01
    技术分享(持续更新)
    计算机英语词汇大全
    XCode的安装包校验伪真
    Objective-C之用C的字符来处理NSString相关的字符替换和拼接的问题
    Objective-C之代理设计模式小实例
  • 原文地址:https://www.cnblogs.com/yml435/p/4655472.html
Copyright © 2020-2023  润新知