下午好!我正在用 C++ 训练排序算法,我遇到了以下问题:
我创建了一个由我通过键盘X
给出的元素组成的数组。X
这一切都在方法中完成main()
int length;
cout << "How many elements do you want to add? Type here: ";
cin >> length;
int array[length];
输入后,我用长随机数X
填充我的数组。X
并在屏幕上显示:
cout << "Your current array is:\n\n";
for(int i = 0; i < length; i++){
array[i] = rand() % 100;
printf("%d ", array[i]);
}
好吧,在那之后我们看到一个未排序的数组..
接下来,我创建一个方法,将我们的数组和我的元素作为参数,并使用 bubble 方法对其进行排序
void sort(int array[]){
int length, temp, j;
length = sizeof(array) / sizeof(*array);
bool sort = true;
while(sort){
j++;
sort = false;
for(int i = 0 ; i < length - j; i++){
if (array[i] > array[i+1]){
temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
sort = true;
}
}
}
}
好吧,在main()
我调用这个方法的方法中..
main(){
//declare array
sort(array);
//output after sorting
}
但是当我运行程序时,我发现我的数组没有排序。我的错误在哪里?我知道,如果您用 Java 编写这样的实现,那么它就可以工作。但是正如我刚刚理解的那样,在 C++ 中则需要不同的方式。
C++ 不支持变长数组。有单独的编译器有自己的 C++ 语言扩展,包括此支持,但最好不要依赖它。所以这段代码
不符合C++标准。
您应该动态分配数组。例如,
并在程序结束时将其删除。
当数组作为函数参数按值传递时,它会隐式转换为指向其第一个元素的指针。因此,这个函数声明
等价于下面的函数声明
并声明相同的功能。
在这个函数里面
句子
并不像您想象的那样计算数组中元素的数量。相当于下面这句话
例如,如果指针大小
sizeof( int * )
为 8,大小sizeof( int )
为 4,则结果将为 2。您应该将函数声明为
或者更好的是如何
对于冒泡排序,请参阅我对 SO 的回答。此外,您 在函数中使用了未初始化的变量
j
,这会导致程序出现未定义的行为请注意,不带参数的主函数必须在 C++ 中声明为
正如您可能已经猜到的那样,您的主要(但不仅是)问题是您错误地计算了数组的大小。如果将变量值的输出写入控制台
length
,您会立即看到这一点。例如,对我来说,它总是等于二。现在怎么处理。您现在实质上是将指向数组开头的指针传递给函数。在这种情况下无法获取元素的数量。
你已经找到了一条出路。将指针传递给开始和大小:
您可以按照标准库的样式执行此操作,并将指针传递给第一个元素和最后一个元素之后的下一个元素:
请注意,它
&arr[4]
返回一个指向不存在的元素的指针。它不能被取消引用。但是为了标记数组的结尾,它会完美贴合。好吧,硬汉的方式:)。链接到数组+模板:
我敢肯定在初始阶段你不应该理会这个头,但你必须承认,它看起来很酷。编译器本身推导出数组的大小,我们甚至不需要做任何事情。