2013-03-07 30 views
1

你們已經幫助了我很多這個代碼。讓我先說我不太熟悉C,並努力做到這一點。在C中創建大型數組時出現了分段錯誤

這檔節目應該做的:

1)創建長度爲10萬元 2)的隨機數的列表排序使用shell排序功能(仍然不工作正確的隨機數列表...我認爲它如何,我傳遞函數指針) 3)做一個列表1百萬更長

4)重複了高達1億,同時記錄時間(時間顯示爲0.0000000出於某種原因)

我只是試圖測試這個shell排序程序與內置的快速排序標準庫。

我試過有和沒有指針...當它的done..It只是弄亂的東西更多的笑

請幫我,你們一直這麼偉大到目前爲止註釋掉部分應該工作...

#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; 
     } 
    } 


} 

回答

2

您可能沒有10兆字節的堆棧空間。使該數組成爲全局數組,使用static聲明它,或使用malloc()動態分配它。如果你選擇後者,不要忘記free()它。

後來,當您需要使用100,000,000元素數組時,請確保使用它的新分配!

+0

我應該從大小100,000,000的數組開始?或繼續做新的? – 2013-03-07 23:11:15

+0

你當然可以那樣做,是的。 – 2013-03-07 23:16:13

0

那麼你沒有辦法在堆棧上有足夠的可用空間。使用malloc()從堆中分配它。請記住隨後釋放()。