我正在编写简单的学校计划,展示选择排序。我正在填充数组 使用rand()函数,但在输入数组程序的长度后挂起输入。当我输入一些废话(字符或字符串)时,程序用零数组执行。
以下是代码:
/*Selection sort implementation-
Autor: Adam Rychter
09/12/13*/
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int* selection_sort(int array[], int length);
int main(void) {
int length, num;
int* array;
cout << "Enter the length of array to sort: ";
cin >> length;
array = new int[length];
for(int i = 0; i < length; i++) {
num = rand();
array[i] = num;
}
int *sorted_array_ptr = selection_sort(array, length);
system("clear");
cout << "Sorted array:" <<endl;
for(int i = 0; i < length; i++) {
cout << " " << sorted_array_ptr[i];
}
free((void*) array);
cout << "\n";
}
int* selection_sort(int array[], int length) {
for(int i = 0; i < length; i++) {
int max_index = i;
for(int j = i + 1; j < length; j++) {
if(array[j] > array[max_index]) {
max_index = j;
}
}
int tmp = array[i];
array[i] = array[max_index];
array[max_index] = tmp;
}
return array;
}
我正在使用启用了-o3优化的G ++编译器。万分感谢答案。 Adam Rychter
答案 0 :(得分:2)
首先,删除此行
system("clear");
其次,改变这一点,
free((void*) array);
要,
delete []array;
如果您使用new
,那么您将按delete
解除分配空间。如果您使用malloc
,那么您将按free
解除分配空间。在两者之间混淆将导致问题。
更喜欢使用new/delete
而不是malloc/free
。
根据C++ FAQ Lite,
[16.4]为什么我应该使用new而不是值得信赖的旧malloc()?
FAQ:new / delete调用构造函数/析构函数;新的是类型安全的, malloc不是; new可以被一个类覆盖。
FQA:常见问题解答中提到的新优点不是美德,因为 构造函数,析构函数和运算符重载都是垃圾(参见 当你没有垃圾收集时会发生什么?)和类型 安全问题在这里很小(通常你必须抛出虚空* 由malloc返回到右指针类型以将其分配给键入的类型 指针变量,这可能很烦人,但远非“不安全”。)
哦,使用值得信赖的旧malloc可以使用 同样值得信赖的旧的realloc。太糟糕了,我们没有一个闪亮的新 运营商更新等等。
尽管如此,新的还不足以证明偏离共同点 整个语言中使用的样式,即使语言是C ++。在 特别是,具有非平凡构造函数的类将会出错 如果你只是malloc对象的致命方式。那么为什么不使用新的 整个代码?人们很少超载操作员新的,所以它 可能不会过多地妨碍你。如果他们确实过载新的, 你可以随时要求他们停下来。