实现归并排序
Implementing Merge Sort
所以,我正在尝试实现归并排序,我在概念上理解它,但显然在编程方面有很大困难(我没有经验)。我查阅了以前的帖子,这些帖子有帮助,但我无法超越这一点。我目前遇到以下错误:
13:20: error: âSizeâ was not declared in this scope
mergesort(array[Size], low, mid);
41:20: error: invalid conversion from âintâ to âint*â [-fpermissive]
mergesort(data[size], 0, size-1);
6:6: error: initializing argument 1 of âvoid mergesort(int*, int,
int)â [-fpermissive] void mergesort(int array[], int low, int high)
我也很困惑一般如何进行。我真的也不知道如何将所有内容合并在一起。这似乎并没有这么困难,但递归确实让我感到困惑:/提前感谢您的帮助。
#include <iostream>
using namespace std;
void merge(int[], int, int, int);
void mergesort(int array[], int low, int high)
{
int mid;
if(low < high)
{
mid = low + (high-low)/2;
mergesort(array[Size], low, mid);
mergesort(array[Size], mid+1, high);
merge(array[Size], low, mid, high);
}
}
void merge(int array, int low, int mid, int high)
{
}
int main()
{
int size;
cin >> size;
int data[size];
for(int i = 0; i < size; i++)
{
cin >> data[i];
}
mergesort(data[size], 0, size-1);
}
data[Size]
尝试从数组 data
中获取第 Size
个值。 Size
不存在,我认为这不是您想要的。如果你想引用数组本身,只需使用它的名称:data
.
您稍后在使用 data[size]
时遇到了同样的问题,除了 size
在这种情况下确实存在。错误消息告诉您它无法将 int
转换为 int*
。当你声明一个像int array[]
这样的函数参数时,它实际上只是int* array
的语法糖。您将 data[size]
传递给此参数,它会尝试从 data
访问 int
(尽管 size
超出范围)。因此,编译器不知道如何将 int
转换为 int*
- 它们是不同的类型。
请注意,以下代码不是标准 C++,因为不支持可变长度数组:
int size;
cin >> size;
int data[size];
也就是说,数组的大小需要在编译时知道,而 size
则不是。您可以改为使用 std::vector<int> data(size);
.
此外,您对 merge
的声明和定义不匹配 - 一个将 int
作为其第一个参数,而另一个将 int[]
.
您似乎难以理解静态数组与动态数组。
我建议使用 std::vector 而不是你的 data[size] 声明。
关于您的错误:
请注意,在您的合并排序函数中,您指的是未定义的大小。如果你想使用静态数组,我建议如下:
#define SIZE 200
...
int data[SIZE];
这将允许您在整个代码中使用相同的 SIZE。
但是您的数组不会是您输入的大小。
如果你想在运行时分配一个数组,你需要改变你的代码
int size;
cin >> size;
int data[size];
到
int size;
cin >> size;
int* data = new int[size];
然后,在您的合并排序函数中,您必须将大小作为参数传递。
所以,我正在尝试实现归并排序,我在概念上理解它,但显然在编程方面有很大困难(我没有经验)。我查阅了以前的帖子,这些帖子有帮助,但我无法超越这一点。我目前遇到以下错误:
13:20: error: âSizeâ was not declared in this scope mergesort(array[Size], low, mid);
41:20: error: invalid conversion from âintâ to âint*â [-fpermissive] mergesort(data[size], 0, size-1);
6:6: error: initializing argument 1 of âvoid mergesort(int*, int, int)â [-fpermissive] void mergesort(int array[], int low, int high)
我也很困惑一般如何进行。我真的也不知道如何将所有内容合并在一起。这似乎并没有这么困难,但递归确实让我感到困惑:/提前感谢您的帮助。
#include <iostream>
using namespace std;
void merge(int[], int, int, int);
void mergesort(int array[], int low, int high)
{
int mid;
if(low < high)
{
mid = low + (high-low)/2;
mergesort(array[Size], low, mid);
mergesort(array[Size], mid+1, high);
merge(array[Size], low, mid, high);
}
}
void merge(int array, int low, int mid, int high)
{
}
int main()
{
int size;
cin >> size;
int data[size];
for(int i = 0; i < size; i++)
{
cin >> data[i];
}
mergesort(data[size], 0, size-1);
}
data[Size]
尝试从数组 data
中获取第 Size
个值。 Size
不存在,我认为这不是您想要的。如果你想引用数组本身,只需使用它的名称:data
.
您稍后在使用 data[size]
时遇到了同样的问题,除了 size
在这种情况下确实存在。错误消息告诉您它无法将 int
转换为 int*
。当你声明一个像int array[]
这样的函数参数时,它实际上只是int* array
的语法糖。您将 data[size]
传递给此参数,它会尝试从 data
访问 int
(尽管 size
超出范围)。因此,编译器不知道如何将 int
转换为 int*
- 它们是不同的类型。
请注意,以下代码不是标准 C++,因为不支持可变长度数组:
int size;
cin >> size;
int data[size];
也就是说,数组的大小需要在编译时知道,而 size
则不是。您可以改为使用 std::vector<int> data(size);
.
此外,您对 merge
的声明和定义不匹配 - 一个将 int
作为其第一个参数,而另一个将 int[]
.
您似乎难以理解静态数组与动态数组。
我建议使用 std::vector 而不是你的 data[size] 声明。
关于您的错误:
请注意,在您的合并排序函数中,您指的是未定义的大小。如果你想使用静态数组,我建议如下:
#define SIZE 200
...
int data[SIZE];
这将允许您在整个代码中使用相同的 SIZE。
但是您的数组不会是您输入的大小。
如果你想在运行时分配一个数组,你需要改变你的代码
int size;
cin >> size;
int data[size];
到
int size;
cin >> size;
int* data = new int[size];
然后,在您的合并排序函数中,您必须将大小作为参数传递。