2011-09-18 3 views
1

C에서이 버블 정렬 알고리즘을 만들었습니다. DM에서 잘 작동하지만 gcc에서 실행될 때 잘못된 결과가 나옵니다.버블 정렬 프로그램, DM 컴파일러 (Windows) 및 GCC (Ubuntu)에서 작동하지 않음

#include <stdio.h> 

int i,j; 

void BubbleSort(int*a, int n) //to sort the numbers 
{ 
    int temp; 
    for(i=0; i<n;i++) 
     for(j=n; j>i;j--) 
      if (a[j]<a[j-1]) 
       { 
        temp=a[j]; 
        a[j]=a[j-1]; 
        a[j-1]=temp; 
       } 
} 

void Display(int * a, int n) //to display 
{ 
    printf("\nThe sorted numbers are:\n"); 
    for(i=0;i<n;i++) 
     { 
      printf("%d, ",a[i]); 
     } 
} 

int main() 
{ 
    int a[50],n,choice; 
    printf("\nEnter no. of elements to sort: (max. 50) "); 
    scanf("%d",&n); 
    printf("\nEnter the numbers : "); 

    for(i=0;i<n;i++) 
     scanf("%d",&a[i]); 

    BubbleSort(a,n); 
    Display(a,n); 

    return 0; 

} //End of main 

입력 :

5 
2 1 5 3 4 

DM 출력 :

1, 2, 3, 4, 5, 

GCC 출력 : 왜 이런 일이

1, 2, 3, 5, 4, 

얼마나?

+1

는 디버거에서 단계별로 시도? 또는 변수의 중간 값 인쇄? –

+2

루프에서 배열의'(n + 1) 번째 요소에 접근하고 있습니다 : 'j'가 5에서'i '로 바뀌면'a [j]'는'a [5]'입니다. 그러나 5 개의 요소가있는 배열은 '5'의 인덱스를 갖지 않습니다. – pmg

+1

어떤 상황에서도 전역 변수'i'와'j'를 사용하는 것은 소름이 듭니다. (단일 문자 전역 변수를 사용할 이유가 거의 없습니다.) 루프 변수 선언을 피하는 방편 일 때 두 배입니다. C99에서는'for (int i = 0; ...)'등을 쓸 수 있습니다. –

답변

4

이 기능이 전혀 작동하지 않는다는 것은 의심스러운 사실입니다. 이 줄에 원래의 배열을 넘고있어 : 당신은 a[n]의 값이 초기화시가 무엇이든 그래서 당신이 초기화되지 않은 값을 비교하는

if (a[j]<a[j-1]) // sketchy when j==n 

.

이 줄 :

for(j=n; j>i;j--) 

은 다음과 같아야합니다

for(j=n-1; j>i;j--) 
+0

안녕하세요. 감사합니다. 그것은 논리적 오류였습니다 ...하지만 지금은 디지털 화성 컴파일러에서 $ ED가 작동하는 이유를 알아 내려고 노력하고 있습니다 !! :/ – praful

+2

@Ashwini : 동작이 정의되지 않았으므로 아무 일도 발생할 수 없습니다. "올바르게"일하는 것은 실제로 최악의 결과입니다. –

+0

"최악의 결과"부분에 동의하십시오. 내가 GCC에서 다시 테스트하지 않았다면 아마 오류를 깨닫지 못했을 것입니다.이제 사람들이 보통 GCC를 좋아하는 이유를 알았습니다. – praful