【发布时间】:2020-10-16 05:52:34
【问题描述】:
我必须使用递归选择排序来对不同的整数数组进行排序。
这些数组分别由100、1000、10000、100000、200000、500000项组成,可以由有序数、偏序数、倒序数和随机数组成。
之后,我必须计算算法对数组进行排序所花费的时间。
我必须使用递归,这是一个家庭作业。
我创建了一个生成数组的函数:
typedef enum {ORINATO, INVERS, PARZ_ORDINATO, RANDOM} Ordine;
int *generaArray(int dimensione, Ordine ordine) {
int i, j, n;
int *array = (int*)malloc(dimensione * sizeof(int));
if (!array){
return NULL;
}
switch (ordine){
case ORINATO:
for (i = 0; i < dimensione; i++){
array[i] = i;
} break;
case INVERS:
n =0;
for ( i = dimensione-1; i >= 0 ; i--) {
array[i] = n;
n++;
}break;
case PARZ_ORDINATO:
for (i = 0; i < dimensione/2 ; i++) {
array[i] = i;
}
for (j = i+1; j <dimensione; j++){
n = rand();
array[j] = n;
};break;
case RANDOM:
for ( i = 0; i <= dimensione ; i++) {
array[i] = rand();
}break;
default:
break;
}
return array;
}
它就像奇迹一样工作。
然后我创建了递归选择排序,如下所示:
void recursiveSelectionSort(int *array, int dim, int start){
int min=0;
if (start >= dim-1){
return;
}
min = findMin(array, start, start+1, dim);
swap(&array[min], &array[start]);
recursiveSelectionSort(array, dim, start+1);
}
int findMin(int *array, int min, int start, int dim){
if(start == dim ){
return min;
}
if (array[start]< array[min]){
min = start;
}
return findMin(array, min, start+1, dim);
}
void swap (int* x, int *y){
int temp = *x;
x = *y;
y = *temp;
}
现在,这也应该有效,但显然不是。让我们举一个实现的例子,这就是我放在我的主要内容:
int main() {
int *array;
clock_t start, end;
double t;
array = generaArray(1000, ORINATO);
start = clock();
recursiveSelectionSort(array, 1000, 0);
end = clock();
t = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("\nIl tempo impiegato per 1000 elementi è: %lf secondi", t);
return 0;
}
这行得通(但它应该更慢,谢谢)。但是,如果您尝试将尺寸从 1000 更改为 200000 或 500000,则会显示错误 11。
是什么原因造成的?我尝试了所有方法,但似乎不起作用。
【问题讨论】:
-
您可能溢出了堆栈。递归在这里可能不是一个实际的解决方案。为什么要使用递归而不是迭代来执行此操作?可能任何可以用递归完成的事情都可以用另一种方式完成。
-
@Basya 这是作业,我必须...
-
我明白了。而且....正如我在评论之前应该说的,欢迎来到 Stack Overflow!
-
谢谢...你知道如何让它工作吗?如果我以迭代的方式这样做,它就像一个魅力
-
您被特别指示使用递归,每个元素的递归级别,用于如此大的数字?
标签: c algorithm recursion selection-sort function-definition