2016-07-15 2 views
0

프로그램을 실행하려고하면 메시지가 나타납니다. 왜?배열을 while 및 when로만 정렬하는 경우

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

이 루프는 이해가되지 않습니다.

프로그램은 당신이 그것을 다음과 같은 방법을 구현할 수있는 정렬 기능은 한 동안 루프를하였습니다하려면이 프로그램의 출력은

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

있는 다음과 같은 방법

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

볼 수 있습니다

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 루프 버블 종류의을 구현하기 위해 시도해야합니다. i이 unconditionly 증가하기 때문에

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

프로그램에서