使用归并排序计算反转次数[关闭]

Posted

技术标签:

【中文标题】使用归并排序计算反转次数[关闭]【英文标题】:counting number of inversions using merge sort [closed] 【发布时间】:2014-08-04 20:22:10 【问题描述】:

我编写了以下代码,用于使用分而治之计算 c++ 中的反转次数,但它不起作用,有人能告诉我这里出了什么问题吗?有人可以解释我的代码有什么问题,而不是发布任何其他相关问题的链接,因为我已经通过它们并且无法弄清楚我的代码有什么问题

#include <iostream>
#include <string>
using namespace std;
int merge_count_inverse(int left[],int right[])  /*counting number of inversion using merge sort*/

 int i=0;
 int c=0;
 int r=0;
 int j=0;
 int len_arr=0;
 int len_left=(sizeof(left)/sizeof(*left));
 int len_right=(sizeof(right)/sizeof(*right));
 len_arr=(len_left+len_right);
 int arr[len_arr];
 while((i<len_left)||(j<len_right))
  
    if (left[i]<right[j])
     
        arr[r]=left[i];
        r++;
        i++;
     
    if (left[i]>right[j])
     
        arr[r]=right[j];
        r++;
        j++;
        c=c+len_left-i;
     
  
return (c);

  


int sort_count(int arr[])  
 



int cou=0;
int l=0;
int r=0;
int m=0;


int len_arr=(sizeof(arr)/sizeof(*arr));

int middle=0;
middle=len_arr/2;

int left[middle];
int right[middle];



if (len_arr <2)

    return(0);

else

    for (int i=0;i<=(middle-1);i++)
    
        left[i]=arr[i];
        right[i]=arr[middle+i];
    
    l=l+sort_count(left);
    r=r+sort_count(right);
    m=m+merge_count_inverse(left,right);
    cou=cou+l+r+m;
    return(cou);




    int main()
     
       int arr[8]=2,5,1,3,8,7,6,9;
       int len_arr=(sizeof(arr)/sizeof(*arr));


       int co=0;

       co+=sort_count(arr);
       cout<<co;

      

【问题讨论】:

这太宽泛了,您不能假设有人会花时间研究您的所有功能以寻找(可能的)错误。您应该收紧域并向我们展示缩小到尽可能少的代码行的确切问题 我认为合并排序计数没问题,可能是主要或排序计数或两者兼而有之。如果我知道我哪里出错了,我会问一个更准确的问题,尽管你也在写,也许我会等待有人表现出一点善意 【参考方案1】:

我没有查看您的所有代码,但足以指出函数sort_count 无效。它的参数调整为int * 所以len_arr的计算没有意义

int sort_count(int arr[])  
 

// ...
int len_arr=(sizeof(arr)/sizeof(*arr));

实际上显示的语句等价于

int len_arr=(sizeof( int * )/sizeof( int ));

您应该将函数定义为具有数组引用类型参数的模板函数或具有两个参数的非模板函数。第二个参数将指定数组的大小。

同样适用于函数merge_count_inverse

int merge_count_inverse(int left[],int right[])  /*counting number of inversion using merge sort*/

 // ...
 int len_left=(sizeof(left)/sizeof(*left));
 int len_right=(sizeof(right)/sizeof(*right));

len_leftlen_right 的计算没有意义,因为 leftright 不是数组。它们是指针int *

【讨论】:

感谢您的帮助

以上是关于使用归并排序计算反转次数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

利用归并排序法计算一个序列里有多少逆序对数(详细讲解)

归并排序[从入门到放弃]

归并排序原理详解!

归并排序

归并排序

归并排序(JS代码)