【发布时间】:2020-12-31 17:25:12
【问题描述】:
概述:
我正在实现一个程序,该程序使用快速排序算法对具有不同大小并以不同方式排序的不同数组进行排序。然后我打印出订购每个数组需要多长时间以及进行了多少次交换和比较。
这是一个家庭作业,我需要知道所有不同的时间、交流和比较。
我尝试了什么
看了网上的文章,发现可能是我的编译器,内存太少,导致编译过程受阻,只好在release模式下编译。发布模式给了我同样的问题。我尝试了在线编译器,但没有一个可以工作。
我的程序是如何工作的
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#define CINQUECENTO 500
#define MILLE 1000
#define DUEMILA 2000
#define CINQUEMILA 5000
#define DIECIMILA 10000
#define VENTIMILA 20000
#define CINQUANTAMILA 50000
typedef enum {ORINATO, INVERS, PARZ_ORDINATO, RANDOM} Ordine;
typedef enum{FIVEH, ONET, TWOT, FIVET, TENT, TWENTYT, FIFTYT} Dimensione;
int qconfronti=0, qscambi=0;
int *generaArray(int dimensione, Ordine ordine);
int perno(int* array, int primo, int ultimo);
void quickSort(int* array, int u, int v);
void calculateQuicktime(int *array, int dim);
void automaticQS();
int main(){
automaticQS();
return 0;
}
int *generaArray(int dimensione, Ordine ordine) {
int i, j, n;
int *array = 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;
}
printf("\n");break;
case RANDOM:
for ( i = 0; i <= dimensione ; i++) {
array[i] = rand();
}break;
case ESCI:
break;
default:
break;
}
return array;
}
int perno(int* array, int primo, int ultimo){
int i=primo;
int j=ultimo+1;
int supp=0;
int pivot=array[primo];
while(i<j){
do{
i=i+1;
qconfronti++;
}while(array[i]<=pivot);
do{
j=j-1;
qconfronti++;
}while(array[j]>pivot);
if(i<j){
supp=array[i];
array[i]=array[j];
array[j]=supp;
qscambi++;
}
}
supp=array[primo];
array[primo]=array[j];
array[j]=supp;
qscambi++;
return j;
}
void quickSort(int* array, int u, int v){
int q=0;
if(u==v){
return ;
}
q=perno(array, u, v);
if(u<q){
quickSort(array, u, q-1);
}
if(q<v){
quickSort(array, q+1, v);
}
}
void calculateQuicktime(int *array, int dim){
clock_t start, end;
double t;
qconfronti = 0;
qscambi = 0;
start = clock();
quickSort(array,0, dim);
end = clock();
t = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("\nConfronti: %d \t Scambi: %d", qconfronti, qscambi);
printf("\nTempo impiegato per %d elementi : %lf secondi", dim, t);
}
void automaticQS() {
printf("\nQuick Sort");
printf("\n\nOrdinati:\n");
calculateQuicktime(generaArray(CINQUECENTO, ORINATO), CINQUECENTO);
calculateQuicktime(generaArray(MILLE, ORINATO), MILLE);
calculateQuicktime(generaArray(DUEMILA, ORINATO), DUEMILA);
calculateQuicktime(generaArray(CINQUEMILA, ORINATO), CINQUEMILA);
calculateQuicktime(generaArray(DIECIMILA, ORINATO), DIECIMILA);
calculateQuicktime(generaArray(VENTIMILA, ORINATO), VENTIMILA);
calculateQuicktime(generaArray(CINQUANTAMILA, ORINATO), CINQUANTAMILA);
printf("\n\nParzialmente ordinati:\n");
calculateQuicktime(generaArray(CINQUECENTO, PARZ_ORDINATO), CINQUECENTO);
calculateQuicktime(generaArray(MILLE, PARZ_ORDINATO), MILLE);
calculateQuicktime(generaArray(DUEMILA, PARZ_ORDINATO), DUEMILA);
calculateQuicktime(generaArray(CINQUEMILA, PARZ_ORDINATO), CINQUEMILA);
calculateQuicktime(generaArray(DIECIMILA, PARZ_ORDINATO), DIECIMILA);
calculateQuicktime(generaArray(VENTIMILA, PARZ_ORDINATO), VENTIMILA);
calculateQuicktime(generaArray(CINQUANTAMILA, PARZ_ORDINATO), CINQUANTAMILA);
printf("\n\nInversamente ordinati:\n");
calculateQuicktime(generaArray(CINQUECENTO, INVERS), CINQUECENTO);
calculateQuicktime(generaArray(MILLE, INVERS), MILLE);
calculateQuicktime(generaArray(DUEMILA, INVERS), DUEMILA);
calculateQuicktime(generaArray(CINQUEMILA, INVERS), CINQUEMILA);
calculateQuicktime(generaArray(DIECIMILA, INVERS), DIECIMILA);
calculateQuicktime(generaArray(VENTIMILA, INVERS), VENTIMILA);
calculateQuicktime(generaArray(CINQUANTAMILA, INVERS), CINQUANTAMILA);
printf("\n\nCasuali:\n");
calculateQuicktime(generaArray(CINQUECENTO, RANDOM), CINQUECENTO);
calculateQuicktime(generaArray(MILLE, RANDOM), MILLE);
calculateQuicktime(generaArray(DUEMILA, RANDOM), DUEMILA);
calculateQuicktime(generaArray(CINQUEMILA, RANDOM), CINQUEMILA);
calculateQuicktime(generaArray(DIECIMILA, RANDOM), DIECIMILA);
calculateQuicktime(generaArray(VENTIMILA, RANDOM), VENTIMILA);
calculateQuicktime(generaArray(CINQUANTAMILA, RANDOM), CINQUANTAMILA);
}
- 它生成一个数组,该数组可以有有序数(0,1,2,3,4,5...),部分有序数(0,1,2,3,6,64,44...) , 倒数 (...6,5,4,3,2,1,0) 和随机数 (42,64,2,7,53,25,1...);
- 它可以快速排序各种数组;
- 它会打印出我们需要的东西。
问题
为什么我的程序只打印出有序数字数组然后崩溃给我退出代码 11?
附言。我用 CLion
【问题讨论】:
-
你有没有在调试器中运行程序看看它在哪里崩溃?
-
case ESCI:无法编译,因为它未定义。一旦我删除了这种情况,您的程序在calculateQuicktime调用quickSort从calculateQuicktime(generaArray(VENTIMILA, ORINATO), VENTIMILA);开始递归调用quickSort3574 次后因堆栈溢出而崩溃 -
它从第三个偏序数组崩溃。我只是注意到随机的也可以...@RetiredNinja
-
@RetiredNinja 是的,我的糟糕之处在于我的程序的其余部分,我刚刚从帖子中删除了它,抱歉......
-
是的,它也对我崩溃了!所以你建议我们在那里有一个堆栈溢出?我在想这个,但我不太确定......
标签: c algorithm recursion data-structures quicksort