답변:
정렬 할 배열의 요소로 채워진 추가 데이터 구조, 즉 힙은 최소값 추출 및 정렬 프로세스를 지원하는 데 사용됩니다.
아니요. O (1) 개 이상의 추가 메모리를 사용하지 않고 힙 제약 조건을 준수하도록 배열이 변환되었습니다. (실제로 필요한 것은 스왑 목적으로 배열의 한 요소와 함께 부울 또는 2 개와 루프 변수 또는 2 개를 보유하기에 충분한 추가 메모리입니다.)
기술적으로는 heapsort가 일반적으로 별도의 힙을 사용하는 것으로 설명되어 있지만 적절하게 구현할 수 있습니다.
배열을 사용하여 트리의 레이아웃을 지정할 수 있다는 기본적인 이해가 없을 수 있습니다.
이진 트리가 있고 내부 노드가 배열의 인덱스 i에 있다고 가정하십시오. 그런 다음 해당 노드의 부모 및 자식 배열 인덱스를 찾을 수 있습니다.
Parent(i) = floor(i/2)
Left child(i) = 2i
Right child(i) = 2i + 1
보다:
http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/heapSort.htm
힙을 배열로 유지하고 구성 할 수 있으므로 입력 배열 내부에서 요소를 이동하여 힙 정렬을 제자리에서 실행할 수 있습니다. 실제로 힙은 원래 입력 배열을 사용하여 빌드 및 조작됩니다.
당신이 말했듯이 힙을 빌드하기 위해 실제로 추가 구조가 필요하다면 heapsort는 실제로 정렬 알고리즘이 아닙니다.
그러나 그렇지 않습니다. 정렬하려는 것과 동일한 배열에 힙을 빌드 한 후 힙 정렬 알고리즘을 적용하여 제자리에 정렬 할 수 있습니다.
컴퓨터 과학에서 인플레 이스 알고리즘 (또는 라틴 인 시튜)은 적은 양의 추가 저장 공간이있는 데이터 구조를 사용하여 입력을 변환하는 알고리즘입니다. 알고리즘이 실행될 때 일반적으로 입력이 출력에 의해 덮어 쓰기됩니다. 제자리에없는 알고리즘을 제자리 안 또는 제자리라고도합니다.
공간 요구 사항이 무시할 수 있기 때문에 제자리에있는 것으로 간주됩니다 (비트 단위 연산을 사용하여 항목을 교환하는 경우 일정하거나 전혀 없음). 예를 들어 MergeSort는 검색 예제의 각 반복에서 입력 세트가 수정되지 않기 때문에 제자리에 없습니다.
인플레 이스 알고리즘과 아웃 오브 플레이스 알고리즘의 차이점을 설명하는 가장 좋은 방법은 K & R에서 제공하는 다음 C / C ++ 문자열 반전 코드를 보는 것입니다.
void reverse(char s[])
{
int c, i, j;
for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
예를 들어, 끝에서 입력 문자열을 읽고 문자를 다른 버퍼에 배치 한 경우 이는 문자열 외부 반전 알고리즘입니다.