2011-01-12 3 views
2

I am working on this question. 내 함수 프로토 타입은 내가 leftPos + (rightPos-leftPos)/2 (rightPos-leftPos)/2 rightPos에이 순서로 정렬됩니다에 leftPos을 알고있는 함수의 두번째 부분에서배열이 두 개일 때 정렬이 어떻게됩니까?

static void Sort(byte[] arr, int leftPos, int rightPos) 

입니다.

나는 두 부분이 순서대로되어 있음을 알기에 내가 어떻게 할 수 있는지 생각해 보았다. 나는 어떤 것도 생각할 수 없었다. merge sort에서 병합 함수를 살펴 봤지만 대신 출력 배열을 사용합니다.

두 조각이 모두 순서대로 정렬되어 있는지 어떻게 알 수 있습니까?

참고 : 기본 배열과 동일한 길이의 여분의 배열을 임시 메모리로 사용할 수 있지만 각 병합 후에 Array.Copy를 수행해야한다고 생각했습니다.

답변

1

현재 위치에서 병합이 가능하지만, 복잡하고 많은 성능 향상을 얻지 못합니다. 다음은 here의 샘플 코드입니다. fromleftPos, torightPos, pivot(rightPos-leftPos)/2이며 길이는 각 절반의 길이입니다.

void merge(int from, int pivot, int to, int len1, int len2) { 
    if (len1 == 0 || len2==0) return; 
    if (len1+len2 == 2) { 
    if (compare(pivot, from) < 0) 
    exchange(pivot, from); 
    return; 
    } 
    int first_cut, second_cut; 
    int len11, len22; 
    if (len1 > len2) { 
    len11=len1/2; 
    first_cut = from + len11; 
    second_cut = lower(pivot, to, first_cut); 
    len22 = second_cut - pivot; 
    } else { 
    len22 = len2/2; 
    second_cut = pivot + len22; 
    first_cut = upper(from, pivot, second_cut); 
    len11=first_cut - from; 
    } 
    rotate(first_cut, pivot, second_cut); 
    int new_mid=first_cut+len22; 
    merge(from, first_cut, new_mid, len11, len22); 
    merge(new_mid, second_cut, to, len1 - len11, len2 - len22); 
} 
+0

하위 및 상위 btw는 무엇입니까? rotate ... .... 이것을보고있는 동안, 방금 두 번째 배열을 사용하고 array.copy를 사용하면 더 좋습니다. 이보다 훨씬 적은 줄이있을 것이고, + 함수는 빠져있다. (나는 모두 아래쪽, 위쪽, 회전한다.) –

+1

@acid 나는 [source] (http://thomas.baudel.name/Visualisation/VisuTri/inplacestablesort.html)를 인용했다. 이러한 기능을 정의합니다. 나는 동의한다 - 물건을 제자리에 유지하기 위해 오버 헤드를 추가 할 때 그만한 가치가있는 일은 없을 것이다. 나는 단지 필요한 경우 할 수 있다는 것을 보여 주려고했다. – marcog

관련 문제