프로그래밍

 3198, 1/160 회원가입  로그인  
   ljh7009
   c언어 삽입 정렬 중 간접정렬 질문드려요

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=6518 [복사]


전체적인 소스는

#include <stdio.h>
#include <malloc.h>

void indirect_insert_sort(int a[], int index[], int n)
{
        int i, j;
        int t;

        for(i = 0; i < n; i++)
                index[i] = i;

        for(i = 1; i< n; i++)
        {
                t = index[i];
                j = i;

                while(a[index[j-1]] > a[t] && j > 0)        
                {                                    
                        index[j] = index[j-1];
                        j--;
                }

                index[j] = t;
        }
}

void rearrange(int a[], int index[], int n)
{
        int *p;
        int i;
        p = (int*)malloc(sizeof(int) * n);

        for(i = 0; i < n; i++)
                p[i] = a[index[i]];

        for(i = 0; i < n; i++)
                a[i] = p[i];

        free(p);
}

void print_arr(int a[], int n)
{
        int i;

        for(i = 0; i < n; i++)
                printf("%-5d", a[i]);

        printf("\n");
}

void print_index_arr(int a[], int index[], int n)
{
        int i;

        for(i = 0; i < n; i++)
                printf("%-5d", a[index[i]]);

        printf("\n");
}

int main()
{
        int arr[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
        int len = sizeof(arr) / sizeof(int);
        int index[sizeof(arr) / sizeof(int)] = {0, };

        printf("초기값\n");
        print_arr(arr, len);
        
        indirect_insert_sort(arr, index, len);

        printf("\n간접 정렬 후 arr 값\n");
        print_arr(arr, len);

        printf("\n간접 정렬 후 arr[index] 값\n");
        print_index_arr(arr, index, len);

        rearrange(arr, index, len);

        printf("\n간접 정렬, 재배열 후 arr값\n");
        print_arr(arr, len);

        return 0;
}

이것입니다.

이 중에 컴파일 시 indirect_insert_sort 함수의

while(a[index[j-1]] > a[t] && j > 0) 부분이 에러가 납니다.

근데 조건 순서를 while(j > 0 && a[index[j-1]] > a[t]) 로 바꾸면

에러가 나지 않습니다... 이유를 알려주실 수 있나요??

  Hit : 5497     Date : 2015/03/19 06:22



    
Prox while(j > 0 && a[index[j-1]] > a[t]) 이게 맞는 코딩입니다.

c언어의 &&나 || 연산자는 계산시에 short-circuit evaluation을 합니다
쉽게말하면 a&&b 의 경우, a가 거짓이면 b를 계산하지 않고 바로 false로 처리하는겁니다
그래서 j>0같은 인덱스 검사는 &&의 왼쪽에 넣어야합니다

while(a[index[j-1]] > a[t] && j > 0) 같은경우에는...
j=0일때 먼저 index[j-1]=index[-1]의 값을 읽어오겠죠? 아마 -123456같은 dummy값이 읽히겠죠
그리고 다시 a[-123456] 처럼 접근하면... 매우 높은 확률로 access violation이 발생할 겁니다
2015/03/20