为什么我的程序无法用于大型数组?

时间:2016-02-04 04:13:28

标签: c arrays sorting

我之前在网站上发布了this问题,我设法达到的解决方案(或多或少)。简而言之,我需要测试各种大小的数组的插入和快速排序算法,并了解它们的运行时间如何随阵列大小而变化。

唯一的问题是,当我的程序试图计算具有100个元素和更大元素的数组的快速排序算法的运行时时,它似乎会冻结。我已经尝试过调试代码,但我似乎无法理解为什么会出现这种情况。当我运行它时,这是我得到的输出:

enter image description here

为什么它会停在那里?为什么运行时为零?谁能帮我这个?在我原来的问题中,一些评论者建议我使用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;
}

1 个答案:

答案 0 :(得分:1)

如果数组中有重复值,

choose_piv可以进入无限循环。如果a[pL]a[pR]a[piv]相同,则内部while循环会立即退出,swap无效(因为两个值都是相同的),外部while循环将永远循环。尝试使用一个小数组,其中所有元素都相同(例如,全部为零)。