2

皆さんはこのコードで私をとても助けてくれました。私はCをよく知らないので、これを行うために本当に一生懸命努力していると言って、序文を述べさせてください。

これは、プログラムが実行する必要があることです。

  1. 長さ1000万の乱数のリストを作成します
  2. シェルソート関数を使用して乱数のリストをソートします(それでも正しく機能しません...関数へのポインターを渡す方法だと思います)
  3. リストを100万長くする
  4. 時間を記録しながら最大1億回繰り返します(何らかの理由で時間は0.0000000と表示されます)

このシェルソートプログラムと標準ライブラリに組み込まれているクイックソートをテストしようとしています。

ポインタありとなしで試しました。コメントアウトされたセクションは、完了すると機能するはずです。それは物事をもっと台無しにするだけです笑

私を助けてください、皆さんはこれまでとても素晴らしかったです...

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


void shellSort(int *A, int n);
void checkSort(int *A, int n);

int main(){

    /*Initialize Random Array*/
    int unsorted_list[10000000];
    int *ptr = &unsorted_list[0];
    int random_number;
    int i;

    srand ( time(NULL) );
    for(i=0; i<10000000; i++){

        random_number = rand();
        unsorted_list[i] = random_number % 10000000;
    }

    //Do C Shell Sort
    double shell_results[10][2];

    double clock_diff;
    int j=10000000;
    clock_t t0, t1;
    int k;


    for(i=0;i<10;i++){



        /*Sort the list using shellSort and take the time difference*/
        t0 = clock();
        shellSort(ptr, j);
        t1= clock();

        /*Take difference in time*/
        clock_diff = (t1 - t0)/CLOCKS_PER_SEC;

        /*Add time and list length to the results array*/
        shell_results[i][0] = (double)j;
        shell_results[i][1] = clock_diff;


        /*Check to make sure the array has been sorted*/
        checkSort(ptr, j);

        /*Re-initialize a longer array*/
        //j+=1000000;
        //for(k=0; k<j; k++){
        //    random_number = rand();
        //    unsorted_list[k] = random_number % 1000000;
        //}

        printf("%d",(int)shell_results[i][0]);
        printf(" ");
        printf("%f",shell_results[i][1]);
        printf("\n");

    }





 return 0;
 }

 void shellSort(int *A, int n){



     int gap , i , j , temp;

     for (gap = n/2; gap>0; gap /=2)
         for (i=gap; i<n; i++)
             for(j = i-gap; j>=0 && A[j] > A[j+gap]; j-=gap){
                 temp = A[j];
                 A[j] = A[j + gap];
                 A[j + gap] = temp;
     }
 }



void checkSort(int *A, int n){

    int i;

    for(i=0;i<n;i++){

        if(A[i]>A[i+1]){

            printf("Error in sorting \n");
            break;
        }
    }
}
4

2 に答える 2

5

おそらく、10 メガバイトのスタック スペースがありません。その配列をグローバルにするか、 で宣言するか、staticを使用して動的に割り当てますmalloc()。後者を選択した場合は、それを忘れないfree()でください。

後で、100,000,000 要素の配列を使用する必要がある場合は、必ず新しい割り当てを使用してください。

于 2013-03-07T23:04:57.817 に答える
0

スタック上でその量のスペースを使用できるようにする方法はありません。malloc() を使用してヒープから割り当てます。後で忘れずに free() してください。

于 2013-03-07T23:07:22.147 に答える