2013-07-30 2 views
0

나는 quicksort 프로그램을 작성 중입니다. 그 때문에 배열을 분할해야합니다. 파티셔닝은 함수 paritionIt()에 의해 수행됩니다.C++ ⎼ 두 가지 유사한 기능을하지만 매우 다르게 수행합니다.

int partition(int beg,int end,double key) 
{ 
    int pLeft = beg; 
    int pRight = end-1; 
    while(pLeft<pRight) 
    { 
     while(array[++pLeft]<key); 
     while(array[--pRight]>key); 
     if(pLeft<pRight) 
      swap(pLeft,pRight); 
    } 
    swap(pLeft,end-1); 
    return pLeft; 
} 

이 블록은 단독으로 실행될 때 잘 작동하는 작동하는 것 같다 : 나는 다음과 배열을 분할의 코드를 썼다. 그러나 다른 기능과 함께 실행하면 잘못된 대답이 생성되는 것 같습니다. 다음 코드는 모든 문제를 사라지게하지만 내 코드와 크게 다르지 않습니다.

int partitionIt(int left, int right, double pivot) 
{ 
    int leftMark = left; //right of first elem 
    int rightMark = right - 1; //left of pivot 
    while(true) 
    { 
     while(theVect[++leftMark] < pivot) //find bigger 
     ; // (nop) 
     while(theVect[--rightMark] > pivot) //find smaller 
     ; // (nop) 
     if(leftMark >= rightMark) //if pointers cross, 
      break; // partition done 
     else //not crossed, so 
      swap(leftMark, rightMark); //swap elements 
    } //end while(true) 
    swap(leftMark, right-1); //restore pivot 
    return leftMark; //return pivot location 
} //end partitionIt() 

블록은 광산과 유사한 것으로 보인다하지만 내가 아닌 반면, 정답을주고있다. partition()partitionIt()의 차이점을 알려주시겠습니까?

+0

코드 (첫 번째 블록)를 두 번째 블록으로 바꾸면 모든 함수가 예상대로 작동합니까? – Kevin

+1

두 코드 사이에 기능상의 차이점이 없습니다. –

+0

그래 ... 사실, 내 전체 코드는 책에서 주어진 코드와 일치합니다 (변수 이름 제외). – kusur

답변

1

차이점은 루핑 구조를 벗어나는 부분입니다.

코드에서 두 가지 조건부 검사를 수행하는 반면 주어진 코드에서는 하나만 만들고 있습니다.

잠시 동안 루프를 반복했다고 가정합니다. (의도 한 말장난 없음).

이 코드를 맞는다 :

if(pLeft<pRight) 
       swap(pLeft,pRight); 

는 그런 다음, while 루프의 바닥을 칠 것이다 돌아 가기오고, 다음 pLeft<pRight 경우 다시 확인. 이것이 사실이 아니라면 루프를 종료합니다. 주어진 코드에서

, 당신은 스왑을 수행하지만, 당신은 다음을 수행 : 당신은 루프의 탈옥 경우

while(theVect[++leftMark] < pivot) //find bigger 
    ; // (nop) 
    while(theVect[--rightMark] > pivot) //find smaller 
    ; // (nop) 

당신 다음 검사를 참조하십시오.

이것은 차이점이있는 것 같습니다.

편집 : 명확하게하려면 - while(pLeft>=pRight) 루프를 처음 입력 할 때 어떻게됩니까?

주어진 코드에서 중단 될 때까지 while 루프를 계속 진행하지만 코드에서는 루프 본문을 입력하지 않습니다.

+0

하지만 내 코드에서 값을 바꾼 후에도 왜 주어진 코드가 아닌 루프의 맨 위로 이동합니까? 어떤 루프에서든 우리는 항상 루프의 최상위로 이동하여 조건이 참인지 여부를 확인합니다. 그러나 귀하의 응답에서 당신은 이것이 사실이 아니라고 말하고 있습니다. 설명 해주십시오. – kusur

+0

@kusur 편집을 확인하십시오 - 차이점은 조건부 검사를 수행하고 루프에서 빠져 나오는 부분입니다. – Kevin

+0

어떤 루프에서도 루프의 맨 위로 이동하여 조건을 확인합니다. 주어진 코드에서는 항상 true로 평가됩니다. 귀하의 코드에서는 그렇지 않습니다. – Kevin

1

내가 바로 볼 수있는 유일한 것은 기능이 left + 1 == right 호출하는 경우 다르게 작동한다는 것입니다 : 당신의 기능은 루프를 입력하지 않지만 beg를 반환합니다; 책 에서 기능은 따라서 leftMark를 증가 및 최종 스왑을하고 leftMark을 반환하기 전에 rightMark을 감소시키는 루프를 입력합니다.

관련 문제