2016-07-15 5 views
0

プログラムを実行しようとするとメッセージが表示されます。どうして?配列をwhileとifでのみ並べ替える

Segmentation fault 

私のコード:

#include <stdio.h> 

void sort_array(int *arr, int s); 

int main() { 
    int arrx[] = { 6, 3, 6, 8, 4, 2, 5, 7 }; 

    sort_array(arrx, 8); 
    for (int r = 0; r < 8; r++) { 
     printf("index[%d] = %d\n", r, arrx[r]); 
    } 
    return(0); 
} 

sort_array(int *arr, int s) { 
    int i, x, temp_x, temp; 
    x = 0; 
    i = s-1; 
    while (x < s) { 
     temp_x = x; 
     while (i >= 0) { 
      if (arr[x] > arr[i]) { 
       temp = arr[x]; 
       arr[x] = arr[i]; 
       arr[i] = temp; 
       x++; 
      } 
      i++; 
     } 
     x = temp_x + 1; 
     i = x; 
    } 
} 

私はこの問題はif文であると思います。 あなたはどう思いますか?それはなぜ起こるのですか?私は配列へのポインタを積極的に使うと思います。

ありがとうございました!

+2

「i」が大きすぎるため、範囲外のアクセスが発生し、*未定義の動作*が発生します。 – MikeCAT

+2

-gでプログラムをコンパイルしてgdbで実行すると、失敗した場所が表示されます – pm100

+0

[bubble sort](https://en.wikipedia.org/wiki/Bubble_sort)メソッドを使用してみてください([ここで](http://www.sanfoundry.com/c-program-sort-array-ascending-order/)を使用して配列を昇順でソートする) – iRove

答えて

2

iがunconditionly増加しているので、あなたのプログラム

while (i >= 0) { 
     //... 
     i++; 
    } 

でこのループは意味がありません。あなたはソート機能は、あなたがそれを次のように一つだけwhileループを実装することができていたことをしたい場合

プログラムは次のよう

#include <stdio.h> 

void bubble_sort(int a[], size_t n) 
{ 
    while (!(n < 2)) 
    { 
     size_t i = 0, last = 1; 

     while (++i < n) 
     { 
      if (a[i] < a[i-1]) 
      { 
       int tmp = a[i]; 
       a[i] = a[i-1]; 
       a[i-1] = tmp; 
       last = i; 
      } 
     } 

     n = last; 
    } 
} 

int main(void) 
{ 
    int a[] = { 6, 3, 6, 8, 4, 2, 5, 7 }; 
    const size_t N = sizeof(a)/sizeof(*a); 

    for (size_t i = 0; i < N; i++) printf("%d ", a[i]); 
    printf("\n"); 

    bubble_sort(a, N); 

    for (size_t i = 0; i < N; i++) printf("%d ", a[i]); 
    printf("\n"); 

    return 0; 
} 

を見ることができるプログラム出力は

6 3 6 8 4 2 5 7 
2 3 4 5 6 6 7 8 

ある

void bubble_sort(int a[], size_t n) 
{ 
    size_t i = 0; 

    while (++i < n) 
    { 
     if (a[i] < a[i-1]) 
     { 
      int tmp = a[i]; 
      a[i] = a[i-1]; 
      a[i-1] = tmp; 
      i = 0; 
     } 
    } 
} 
2

内側のループでは、配列のサイズを超えてiが増えます。あなたのアルゴリズムでは、代わりにiを減らす必要がありますが、これでソートアルゴリズムを修正するには十分ではないでしょうか。

あなたは、まずあなたが、隣接する項目を比較し、あなたがそれらを交換するたびにバックステップ単一whileループでバブルソートを実装してみてください。