我正在编写一个合并排序函数,现在我只是使用一个测试用例数组(没有输入 - 这是静态的,现在)。我不知道如何将数组作为参数传递。这是我现在的代码:
//merge sort first attempt
#include <iostream>
#include <algorithm>
#include <vector>
int mergeSort(int[]);
int main()
{
int originalarray[] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
mergeSort(originalarray[]);
}
int mergeSort(int[] originalarray)
{
int num = (sizeof(originalarray)/sizeof(int));
std::vector<int> original(num);
if (num > 2) {
return num;
}
// Fill the array using the elements of originalarray
// This is just for demonstration, normally original will be a parameter,
// so you won't be filling it up with anything.
std::copy(originalarray, originalarray + num, original.begin());
// Create farray and sarray of the appropriate size
std::vector<int> farray(num / 2);
std::vector<int> sarray(num - farray.size());
// Fill those using elements from original
std::copy(original.begin(), original.begin() + farray.size(), farray.begin());
std::copy(original.begin() + farray.size(), original.end(), sarray.begin());
mergeSort(farray);
mergeSort(sarray);
}
请注意,这个mergeSort函数不起作用,因为我还没有弄清楚如何合并它们(这是我的任务)。我想在处理之前对我的两个向量进行排序,因为我需要将数组作为参数传递,所以无法编译。我不明白指针,所以如果这是解决方案,我的借口就是无知。我正在学习编程,使用C ++作为第一语言,并且只能基本掌握语言的功能。谢谢你的帮助。
答案 0 :(得分:30)
答案 1 :(得分:18)
你不应该那样使用sizeof(originalarray)/sizeof(int)
。它只适用于静态声明的数组(大小在编译时是已知的)。你必须传递它的大小。为什么不直接从数组中取出vector
并传递它?
旁注:根据经验,请务必注意sizeof
将在编译时进行翻译。所以它无法知道作为参数传递的数组的大小。
答案 2 :(得分:3)
我看到你包括<vector>
。我建议你不要使用数组的所有用途,只使用vector
类。您可以查看如何使用STL容器的示例,例如vector
here。
答案 3 :(得分:2)
当您将数组传递给函数时,它们会衰减到指向数组的第一个元素的指针,尽管有这种符号。因此,您的sizeof
无法按预期工作。
传入数组时,最好传入数组大小,以便知道停止的位置。将其添加为附加参数。
答案 4 :(得分:0)
除了上述所有答案之外,您可能还想查看来自c-faq.com的Q&amp; As on数组:http://c-faq.com/aryptr/index.html
答案 5 :(得分:0)
不幸的是,要用C或C ++完成你想做的事情是很难的。您可以传递一个固定大小的数组:
int mergeSort(int originalarray[20])
{
// do something
}
但是,数组的大小不是由数字定义的,而是由初始化列表中的元素数定义。
在你的情况下要做的事情(尽管这确实是一件坏事)是分两步完成的:
int originalarray[] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
const size_t arraySize = sizeof originalarray / sizeof originalarray[0];
int mergeSort(int array[arraySize])
{
// do something
}
太糟糕了,它不会做你需要做的事情:将数组传递给这样的函数会产生数组的副本,排序点就是改变原始数组。
事实上,如果不理解“指针”的概念,你就不能再进一步了。
你需要开发的功能应该是这样的:
int originalarray[] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
const size_t arraySize = sizeof originalarray / sizeof originalarray[0];
int mergeSort(int *array, const size_t size)
{
// do something
}
mergeSort(&(originalArray[0]), arraySize);
换句话说,您将指针传递给第一个元素和元素数。
或者,您可以处理向量。 Vector在一个名为“object”的实体中封装了相同的两件事(指向第一个元素和大小的指针)。此外,它还为您管理内存,因此您可以根据需要扩展元素数量。这是C ++的方式。太糟糕了,你不能用{...}来初始化一个矢量,就像你可以用数组一样。
答案 6 :(得分:0)
看起来你正在使用动态分配的数组和向量,当我相信只使用std :: vector就足够了。
首先,让您的输入数组更改为std :: vector,并用输入数据填充它。
int main()
{
std::vector<int> originalarray;
for (int data = 1; data <= 10; data++)
{
originalarray.push_back(data);
}
mergeSort(originaldata);
}
现在声明你的mergesort函数来引用std :: vector是很重要的。
int mergeSort(std::vector<int>& originalarray)
{
// The rest of your code, note that now you are passing
// in your array for sorting, so you can continue with your code to split
// the vector into farray and sarray
// then call sort on your halves.
mergeSort(farray);
mergeSort(sarray);
// I'm guessing at this point you'd write code to combine your farray sarray, and
// put it back into originalarray...don't forget to clear original array first!
}
只是一个注释,看起来你没有做一个就地排序,所以期待你的排序需要一段时间,因为你要复制大量的数据。