我之前在网站上发布了this问题,我设法达到的解决方案(或多或少)。简而言之,我需要测试各种大小的数组的插入和快速排序算法,并了解它们的运行时间如何随阵列大小而变化。
唯一的问题是,当我的程序试图计算具有100个元素和更大元素的数组的快速排序算法的运行时时,它似乎会冻结。我已经尝试过调试代码,但我似乎无法理解为什么会出现这种情况。当我运行它时,这是我得到的输出:
为什么它会停在那里?为什么运行时为零?谁能帮我这个?在我原来的问题中,一些评论者建议我使用malloc
,但我不确定如何去做。
我的代码列在下面,我很感激任何建议。
/*
* Task 1, question h
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//Random Array Length
#define MAX 1000
void perf_routine(int);
void naive_sort(int[],int);
void smarter_sort(int[],int,int);
void swap(int[],int,int);
int choose_piv(int[],int,int);
int main(){
perf_routine(10);
perf_routine(100);
perf_routine(1000);
perf_routine(5000);
perf_routine(10000);
return 0;
}
void perf_routine(int L){
int i, a[L], b[L];
clock_t tic, toc;
printf("Arrays of Length %d:\n", L);
//Generate an array of random numbers
for(i=0; i<L; i++)
a[i]= rand() % (MAX+1);
//Define b identical to a for fair comparison
for(i=0; i<L; i++)
b[i]=a[i];
//Insertion Sort (1e)
tic = clock();
naive_sort(a, L);
toc = clock();
printf("Insertion Sort Runtime: %f seconds\n", (double)(toc-tic)/CLOCKS_PER_SEC);
//Quicksort (1f)
tic = clock();
smarter_sort(b,0,L-1);
toc = clock();
printf("Quicksort Runtime: %f seconds\n", (double)(toc-tic)/CLOCKS_PER_SEC);
}
void naive_sort(int a[], int L){
int i, j, t;
for(i=1; i < L; i++){
t=a[i];
j=i-1;
while((j >= 0) && (t < a[j])){
a[j+1] = a[j];
j--;
}
a[j+1]=t;
}
}
void smarter_sort(int a[], int l, int r){
if(r > l){
int piv = choose_piv(a, l, r);
smarter_sort(a, l, piv-1);
smarter_sort(a, piv+1, r);
}
}
void swap(int a[], int i, int j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
int choose_piv(int a[], int l, int r){
int pL = l, pR = r;
int piv = l;
while (pL < pR){
while(a[pL] < a[piv])
pL++;
while(a[pR] > a[piv])
pR--;
if(pL < pR)
swap(a, pL, pR);
}
swap(a, piv, pR);
return pR;
}
答案 0 :(得分:1)
choose_piv
可以进入无限循环。如果a[pL]
,a[pR]
和a[piv]
相同,则内部while
循环会立即退出,swap
无效(因为两个值都是相同的),外部while
循环将永远循环。尝试使用一个小数组,其中所有元素都相同(例如,全部为零)。