2014-09-25 2 views
1

내 코드 : (나는 그것을 오름차순으로 정렬 된 배열을 기대합니다).왜 alogrithim 정렬 무한 루프가 될

void sort(int arr[], int n) { 
    int c=0; 

    for(int i = 0; i<n-1; ++i) { 
     if (arr[i]>arr[i+1]) { 
      c=arr[i]; 
      arr[i]=arr[i+1]; 
      arr[i]=c; 
      i=0; 
     } 
    } 

} 

예 어레이 : int arr[4]={3,1,2,4};

sort(arr,4); 

에러 : 무한 루프 ???

+1

작은 입력 집합에 대해 수동으로 종이에 (또는 디버거를 사용하여) 코드를 단계별로 실행하십시오. 종료 조건이 충족되지 않는 이유는 무엇입니까? – user2864740

+0

나는 2 시간 동안 당황스럽게 그렇게 해왔다. 배열이 3,4,1,2라면 .. 프로세스가 다음과 같이 진행되어야합니다 : 3,1,4,2 .... 1,3,4,2 ... 1,3,2,4. .1,2,3,4 .. –

+0

"i"거기에 무엇을했는지보십시오. –

답변

4

배열에서 두 개의 연속 요소를 교환하는 코드가 잘못되었습니다. if 문 안의 처음 세 줄을 다음과 같이 바꿉니다.

c = arr[i]; 
arr[i] = arr[i+1]; 
arr[i+1] = c; 

마지막 줄은 제가 고친 것입니다.

이 알고리즘을 bubble sort이라고합니다.

편집 : 당신이 올바른 정렬을 보장하기 위해해야 ​​할 또 다른 한가지는 if 문 끝에 i-1 대신 0에 설정하는 것입니다. 0으로 설정하면 루프의 다음 반복에서 증가하고 1이되고, 이는 코드가 루프의 처음 두 요소를 스왑하는 것을 고려하지 않음을 의미합니다. (Anton Savin의 의견에 감사드립니다.)

+1

와우 ... 내 뇌 .. 블랙홀이나 뭐. –

+2

@MuhammadUmer도'0' 대신에'i = -1'을 설정합니다. 그렇지 않으면'{3, 2, 1, 4}'를 잘못 정렬 할 것입니다. –

+0

-1로 설정하면 왜 작동합니까? –

관련 문제