2016-07-23 4 views
1

私はプログラミングの初心者です。私はK.N.Kingの "C Programming:A Modern Approach"を行っています。今、私は第9章のプログラミングプロジェクト1をやろうとしていますが、セグメンテーションを続けると、コードに何が間違っているのか分かりません。どんな修正もありがとう!Cの配列ソートアルゴリズムのSegfaultエラー

これらの命令です:

は、(それが配列に格納)一連の整数を入力するようユーザに要求するプログラムを書き、その関数のselection_sortを呼び出すことによって、整数をソートします。配列要素がn個あるとき、selection_sortは以下を実行する必要があります。
1.配列を検索して最大の要素を見つけ、配列の最後の位置に移動します。
2.再帰的に呼び出して、配列の最初のn - 1要素をソートします。

#include <stdio.h> 

void selection_sort(int n, int a[n]); 

int main(void) 
{ 
    int n; 

    printf("Number of integers to sort: "); 
    scanf("%d", &n); 

    int a[n]; 

    printf("Enter the integers: "); 
    for (int i = 0; i < n; i++) { 
     scanf("%d", &a[i]); 
    } 

    selection_sort(n, a); 

    printf("Sorted array: "); 
    for (int i = 0; i < n; i++) 
     printf("%d", a[i]); 

    return 0; 
} 

void selection_sort(int n, int a[n]) 
{ 
    int swap, max = a[n - 1]; 

    for (int i = 0; i < n; i++) { 
     if (a[i] > max) { 
      max = a[i]; 
      swap = a[n - 1]; 
      a[n - 1] = max; 
      a[i] = swap; 
     } 
    } 
    if (n > 1) 
     selection_sort(n - 1, a); 
} 

EDIT:

は、これは私のコードである(N> 1)しばらく(N> 1)の場合に変更し、今では完璧に動作します。しかし、なぜそれが間に動作しないのですか?

+0

ような何かを行うことができます呼び出す延々と避けるために、再帰のためのいくつかの基本条件を持っている必要がありますか? – SurvivalMachine

+5

Hello無限再帰...ある時点で再帰を中断する必要があります(停止する必要があるかどうかを確認するベースケースを使用します)。 – jpw

+0

C言語を学ぶときは、デバッガの使用方法も学ぶことが大切です。このコードをシングルステップ実行すれば、どこに問題があるのか​​が明らかになります。 –

答えて

3

selection_sortを呼び出さない条件が必要です。今のように、あなたのselection_sortは常にとなり、無限ループとなります。selection_sortです。

そして、各ステップでnを減らすため、ある時点では負になり、a[-1]にアクセスしますが間違っています。

+0

後で 'n - 1'を計算するので、条件は' n> = 0'ではなく 'n> 0'でなければなりません。そして、これはソートアルゴリズムなので、1要素の配列をソートする必要がないので、 'n> 1 'はさらに優れています。 –

+0

ありがとうございます、今はsegfaultではありませんが、整数が入力されるのを待っている間にハングしますが、配列の対応する要素に各値を代入するためにループに詰まっているようです。 – Wanze

+0

その場合、 'scanf'が成功したかどうかを確認する必要があります。 '1'(正しく読み込まれたフィールドの数)を返すときだけ、プログラムを続行するべきです。 '%d 'の前にスペースを入れて' scanf( "%d"、&var) 'を書いているという噂が聞こえました。 –

2

あなたは同じfunction.Youは、それがセグメンテーションフォールトん

void selection_sort(int n, int a[]) 
{ 
    if(n<=0)return; //base condition 
    int swap, max = a[n - 1];