当前位置: 首页 > 知识库问答 >
问题:

在C #中使用合并排序计数反转

伯英锐
2023-03-14

因此,我理解了使用合并排序对数组中的反转进行计数的一般思路。在合并过程中,您可以递归地计算左子数组和右子数组中的倒数。

这是我为此编写的一些代码。

int count_and_merge(vector<int>& array, const vector<int>& left_subarray, const vector<int>& right_subarray) {

    vector<int> merged {};

    array.clear();

    int left_index = 0, right_index = 0, sorted_index = 0;
    int inversions = 0;

    while(left_index < left_subarray.size() and right_index < right_subarray.size()) {

        if(left_subarray[left_index] <= right_subarray[right_index])
            array.push_back(left_subarray[left_index++]);
        else {

            array.push_back(right_subarray[right_index++]);
            inversions += left_subarray.size() - left_index;

        }

    }

    while(left_index < left_subarray.size()) array.push_back(left_subarray[left_index++]);
    while(right_index < right_subarray.size()) array.push_back(right_subarray[right_index++]);

    return inversions;

}

int count_inversions_and_sort(vector<int>& array) {

    if(array.size() <= 1) return 0;

    int n = array.size();

    vector<int> left_subarray(array.begin(), array.begin() + n / 2),
                right_subarray(array.begin() + n / 2, array.end());
    
    int left_subarray_inversions  = count_inversions_and_sort(left_subarray),
        right_subarray_inversions = count_inversions_and_sort(right_subarray);

    return left_subarray_inversions + right_subarray_inversions + count_and_merge(array, left_subarray, right_subarray); 

}

我很难理解的是为什么在向其附加元素之前必须清除count_and_merge函数中的数组?有没有其他方法可以不清除数组?我问是因为我习惯于用数组[sorted_index]=left_subarry[left_index]编写合并排序

共有1个答案

宋华美
2023-03-14

为什么必须先清除count_and_merge函数中的数组,然后再向其附加元素?

在所示示例中,这是必要的,因为您将元素附加在数组之后。但是,您希望数组保持相同长度,但进行排序。

我这样问是因为我习惯用数组[sorted_index]=left_subarry[left_index]编写合并排序

我看不出为什么你不能使用它来代替std::vector::p ush_back()数组中的原始内容并不重要,因为所需的信息包含在left_subarrayright_subarray中。因此,您可以直接覆盖到数组。事实上,如果你使用这个实现,你甚至不需要事先的std::vector::clear()。

 类似资料:
  • 我知道Stack中有很多这样的实现,但我遇到了一个我无法处理的问题。 首先,我用javascript在khanacademy实现了合并排序,然后我将代码重写为C,并尝试计算数组中的反转次数。 我尽我所能,花了一个小时试图了解我做错了什么。我确实在堆栈中搜索了另一个实现,并试图纠正我的代码。不幸的是,我不知道我做错了什么。我想我计算每一个反转。提前感谢您帮助您了解问题所在。 我的代码: 合并排序函数

  • 对于一个小作业,我应该编写一个简单的合并函数,其原型如下所示: 说明书上说,为了简单起见,我们只取单个数组,,并且的数组,它如下所示: 对于这个作业,我们必须通过几个测试。第一个是两个数组之间的简单合并。第二个是教师自己的merge_sort函数,他调用一些随机排序的数组。这是我对的实现: 当他调用第一个测试时,他只检查两个数组的合并,我的函数起作用,单个数组现在被排序。然而,当他调用merge\

  • 如果在这个程序中,我正在输入一个大小7.so的数组从main()merge_sort(arr,0,6)被传递到相应的函数后,条件被检查,如果(0 但我能够理解合并排序(arr,mid1,high);有人打电话吗?但这个程序运行良好。请解释编译器如何调用merge_sort(arr、mid 1、high)

  • 问题内容: 我正在尝试使用mergesort-我得到的- 计算列表中拆分反转的数量(也就是说,未排序列表的前半部分中的元素应该出现在列表的后半部分中的给定元素之后未排序的列表;例如[3 2 1 4]将包含分割反转(3,1),但不包含(3,2),因为3和2都在上半部。当我到达最终的打印语句时,我得到了我期望的答案- 在这种情况下为9-但是返回值都是不正确的,因为它通过递归返回分割值。我尝试了各种索引

  • 我的任务是用C#为二维数组创建合并排序算法。数组看起来像这样 我需要从文件中取数组并按x的升序对行进行排序,同时程序要检查是否有相同x值同时不同Y值的坐标对,当数组排序后,程序要将其写入文件中。我已经为一维数组创建了算法,但是不懂如何为二维数组重写算法,这是我的代码,请帮助我

  • 问题内容: 在对重复的字符串进行排序时遇到问题, 这是我的代码。 我成功地对第一个数组进行了排序,但是在第二个数组中(使用重复的字符串)似乎输出不井井有条,您能帮助我追踪代码中的错误吗。 这是输出: … 问题答案: 更改 与 输出