如何在一组int上实现合并排序?

时间:2015-05-01 03:34:12

标签: c++ arrays mergesort

我有一个赋值,要求使用合并排序对一百万个int的数组进行排序。我学习合并排序的方式是使用递归来分割例程和合并例​​程。如何使用递归拆分数组?我需要总共制作三个阵列,其中两个是原始阵列的一半吗?

我可能不会说清楚,因为我现在对整个概念感到困惑。

我不知道如何在Python中编码,我不知道修剪的是什么。

4 个答案:

答案 0 :(得分:3)

为了顺序进行合并排序,你应该在递归函数中做以下事情:

  1. 检查数组的大小:如果它小于或等于2,则排序         数组并返回它。
  2. 将数组拆分为两部分,并为每一半调用递归函数。
  3. 合并两个排序数组的结果,这些数组来自第2步的函数调用。
  4. 除非你想并行完成,否则输入的大小对你解决它的方式并不重要。

答案 1 :(得分:0)

对10000个int的数组进行合并排序的方式与对4个元素的排序方式相同。分而治之。

答案 2 :(得分:0)

从技术上讲,你实际上并没有分裂'数组本身,因为在内存中创建另外两个子数组会很浪费。分裂更像是一种直观的思考方式。

相反,你所做的就是将数组视为由两个或多个部分组成。如果你考虑如何在内存中引用数组的部分,特别是当你将一个句柄传递给一个函数时,你通常会处理一个指向数组中第一个元素的地址的指针与其他内容相结合跟踪数组的结尾(通常像一个大小整数)。

所以我们可以做这样的事情来模拟分裂':

#include <iostream>

using namespace std;

static void left_side(int* ptr, int size)
{
    cout << "left side:";
    for (int j=0; j < size; ++j)
        cout << " " << ptr[j];
    cout << endl;
}

static void right_side(int* ptr, int size)
{
    cout << "right side:";
    for (int j=0; j < size; ++j)
        cout << " " << ptr[j];
    cout << endl;
}

static void split(int* ptr, int size)
{
    const int middle_index = size / 2;
    left_side(ptr, middle_index);
    right_side(ptr + middle_index, size - middle_index);
}

int main()
{
    int x[] = {1, 2, 3, 4, 5};
    split(x, 5);
}

// output:
// left side: 1 2
// right side: 3 4 5

这应该可以帮助你开始并清楚地了解什么&#39;分裂&#39;实际意味着在这种情况下。正如您所看到的,我们实际上并没有创建任何新的子阵列,我们只是简单地将现有的单个阵列视为具有多个部分。

答案 3 :(得分:0)

使用库代码......

在每个数组上调用std :: sort。 然后在两个数组上调用std :: merge

如果你正在锻炼就是自己编写,那么就忽略这个答案。