2016-10-16 43 views
-4

這段代碼用於創建數組並對其進行排序,我的作業請求是計算它運行的時間。但似乎這個代碼不起作用。當我輸入$./sorting select v 20000 shell說分割錯誤時,我不知道應該在哪裏修復。總是說分段錯誤,不知道我應該在哪裏修復

#include <stdio.h> 
#include <math.h> 
#include <stdint.h> 
#include <stdlib.h> 

int* insertionSort(int * arr,int len){ 
    for (int i=1; i<len; i++){ 

     int x=arr[i]; 
     int j=i; 

     while (j>0 && x<arr[j-1]){ 
      arr[j]=arr[j-1]; 
      j--; 
     } 

     arr[j]=x; 
    } 

    return arr; 
} 

int* selectionSort(int* arr,int len){ 
    int pos=0; 

    for (int i=0; i<len;i++){ 
     int minpos=arr[i]; 

     for (int j=i; j<len; j++){ 
      if (minpos>arr[j]){ 
       minpos=arr[j]; 
       pos=j; 
      } 

     } 

     int x=arr[i]; 
     arr[i]=minpos; 
     arr[pos]=x; 
    } 

    return arr; 
} 

int* create_array(char category, int n){ 
    int *arr=malloc(n*sizeof(int)); 

    if (category=='s'){ 
     for (int i=0;i<n;i++){ 
      arr[i]=i; 
     } 
    } 
    else if (category=='v'){ 
     for (int i=n-1;i>=0;i--){ 
      arr[i]=i; 
     } 
    } 
    else if (category=='r'){ 
     for (int i=0;i<n;i++){ 
      arr[i]=i; 
     } 
     for(int i = 0; i < n; i++){ 
      int j = rand() % n; 
      int t = arr[j]; 
      arr[j] = arr[i]; 
      arr[i] = t; 
     } 
    } 
    else {return NULL;} 

    return arr; 
} 

void main(char sort_algo,char category,int array_size){ 

    int *arr=create_array(category,array_size); 

    if (&sort_algo == "select"){ 
     selectionSort(arr,array_size); 
    } 
    else{ 
     insertionSort(arr,array_size); 
    } 
} 
+5

'無效的主要(炭sort_algo,焦炭類,INT ARRAY_SIZE)'是奇異'main'。那是你輸入「select v 20000」的方式嗎? –

+2

糾正'main'從'* argv []'中提取參數後,您將會遇到'if(&sort_algo ==「select」)''將會*從不*爲真的問題,因爲它正在比較指針記憶中不同地方的物體。使用'strcmp()'。 –

+0

@BLUEPIXY yep,th request is「Your program must take in three parameters(sort_algo ['select'|'insert'],category ['s','r','v'],array_size )。例如,假設你的程序被稱爲'排序'來測試一個大小爲20000的隨機數組的選擇排序,我們運行(省略時間指令): ./sorting select r 20000 – UUsss

回答

0

你應該修改你的主要功能,原型必須是如下,如果你想利用命令行參數:

INT主(INT ARGC,CHAR *的argv [])

您還必須考慮WeatherVane和Bence Kaulics的建議,並閱讀爲更好地理解概念而提出的建議。

作爲一個側面說明我已經修改你的代碼(至少),它現在就會運行。有很多可以改進的地方。保持學習 !

#include <stdio.h> 
 
#include <math.h> 
 
#include <stdint.h> 
 
#include <stdlib.h> 
 

 
int* insertionSort(int * arr,int len){ 
 
    int i; 
 
    for (i=1; i<len; i++){ 
 

 
     int x=arr[i]; 
 
     int j=i; 
 

 
     while (j>0 && x<arr[j-1]){ 
 
      arr[j]=arr[j-1]; 
 
      j--; 
 
     } 
 

 
     arr[j]=x; 
 
    } 
 

 
    return arr; 
 
} 
 

 
int* selectionSort(int* arr,int len){ 
 
    int pos=0; 
 
    int i; 
 
    for (i=0; i<len;i++){ 
 
     int minpos=arr[i]; 
 
     int j; 
 
     for (j=i; j<len; j++){ 
 
      if (minpos>arr[j]){ 
 
       minpos=arr[j]; 
 
       pos=j; 
 
      } 
 

 
     } 
 

 
     int x=arr[i]; 
 
     arr[i]=minpos; 
 
     arr[pos]=x; 
 
    } 
 

 
    return arr; 
 
} 
 

 
int* create_array(char category, int n){ 
 
    int *arr=malloc(n*sizeof(int)); 
 

 
    if (category=='s'){ 
 
     int i; 
 
     for (i=0;i<n;i++){ 
 
      arr[i]=i; 
 
     } 
 
    } 
 
    else if (category=='v'){ 
 
     int i; 
 
     for (i=n-1;i>=0;i--){ 
 
      arr[i]=i; 
 
      //printf("%d\n",i); 
 
     } 
 
    } 
 
    else if (category=='r'){ 
 
     int i; 
 
     for (i=0;i<n;i++){ 
 
      arr[i]=i; 
 
     } 
 
     for(i = 0; i < n; i++){ 
 
      int j = rand() % n; 
 
      int t = arr[j]; 
 
      arr[j] = arr[i]; 
 
      arr[i] = t; 
 
     } 
 
    } 
 
    else {return NULL;} 
 

 
    return arr; 
 
} 
 
//main with command line arguments 
 
int main(int argc, char *argv[]) { 
 
// argv[0] argv[1] argc[2] argv[3] 
 
// sorting select  v  20000 
 
    int num; 
 
    sscanf (argv[3],"%d",&num); 
 
    int *arr=create_array(argv[2][0],num); 
 

 
    if(strcmp(argv[1],"select")==0){ 
 
     selectionSort(arr,num); 
 
    } 
 
    else{ 
 
     insertionSort(arr,num); 
 
    } 
 
}

+0

非常感謝,我只是不知道爲什麼我仍然需要在使用* argv時使用sscanf(),Can'我是否通過主參數傳遞輸入? – UUsss