알고리즘 리프레셔. 힙 정렬이 정렬 알고리즘 인 이유는 무엇입니까?


15

왜 힙 정렬 이 내부 정렬 알고리즘으로 간주되는지 알 수 없습니다 .

I는 평균 추가 로 배열 요소로 채워 데이터 구조를 정렬 힙 즉, 최소 값의 추출 및 정렬하는 과정을 돕기 위해 사용된다.

여기에 inplace의 정의가 잘못 이해되어 있습니까?

그러나 삽입 정렬 예를 들어 삽입 알고리즘이 제자리에 있다는 것, 즉 요소에 추가 메모리가 필요하지 않다는 것이 분명합니다.

그렇다면 왜 제자리에있는 것으로 간주됩니까?

답변:


12

정렬 할 배열의 요소로 채워진 추가 데이터 구조, 즉 힙은 최소값 추출 및 정렬 프로세스를 지원하는 데 사용됩니다.

아니요. O (1) 개 이상의 추가 메모리를 사용하지 않고 힙 제약 조건을 준수하도록 배열이 변환되었습니다. (실제로 필요한 것은 스왑 목적으로 배열의 한 요소와 함께 부울 또는 2 개와 루프 변수 또는 2 개를 보유하기에 충분한 추가 메모리입니다.)

기술적으로는 heapsort가 일반적으로 별도의 힙을 사용하는 것으로 설명되어 있지만 적절하게 구현할 수 있습니다.


3
별도의 힙 (코드로)이있는 "heapsort"가 예상되는 유일한 장소는 Haskell과 같은 기능적 언어입니다. 같은 이유로 일반적인 기능 "Quicksort"도 제자리에 있지 않습니다. 목록이 많고 전체 정렬은 상태 저장입니다. 배열의 상태 / 데이터를 포함하는 항목을 변경합니다. 겉보기 퀵 정렬이 퀵 정렬이라는 것을 정말로 받아들이지 않기 때문에 겁이 나다. 장소.
Steve314

1
@ Steve314, 나는 "한 더미에 넣은 다음 한 번에 하나씩 요소를 꺼내어 배열에 넣는"효과에 대해 무언가를 가르치는 교재를 보았다고 생각합니다. 그러나 방금 CLR을 확인한 후에는 내부 버전을 표시한다고보고 할 수 있습니다.
피터 테일러

2
@PeterTaylor : 예, 제가 검토하고있는 책 (Skiena)은 여분의 힙을 만들어 힙을 제시했습니다.
user10326

4

배열을 사용하여 트리의 레이아웃을 지정할 수 있다는 기본적인 이해가 없을 수 있습니다.

이진 트리가 있고 내부 노드가 배열의 인덱스 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를 제시 한 것으로 보입니다.이 프리젠 테이션이 알고리즘을 이해하기 쉽게 만드는 것이라고 이해하지 못했다고 생각했을 것입니다. 그)와 같은 발표
user10326

Cormen, et al.의 "Introduction to Algorithms"책을 구입하는 것이 좋습니다. 모든 알고리즘 관련 질문에 명확하게 대답합니다. 컴퓨터 과학자 또는 소프트웨어 엔지니어로서의 경력에 ​​대해 진지한 경우이 책이 필요합니다.
stackoverflowuser2010 년

1

당신이 말했듯이 힙을 빌드하기 위해 실제로 추가 구조가 필요하다면 heapsort는 실제로 정렬 알고리즘이 아닙니다.

그러나 그렇지 않습니다. 정렬하려는 것과 동일한 배열에 힙을 빌드 한 후 힙 정렬 알고리즘을 적용하여 제자리에 정렬 할 수 있습니다.


기본적으로 배열의 데이터를 재정렬하여 IIRC O (n) 시간의 힙 규칙을 준수하는 데 사용되는 "힙"알고리즘이 있습니다. programmers.stackexchange.com/questions/116904/… 의 의사 코드를 참조하십시오 . 그 후, 그것은 힙 힙 추출을 반복하고 배열의 어느 부분이 여전히 "힙"이고 정렬 된 최종 결과의 양을 추적하는 문제입니다.
Steve314

0

컴퓨터 과학에서 인플레 이스 알고리즘 (또는 라틴 인 시튜)은 적은 양의 추가 저장 공간이있는 데이터 구조를 사용하여 입력을 변환하는 알고리즘입니다. 알고리즘이 실행될 때 일반적으로 입력이 출력에 의해 덮어 쓰기됩니다. 제자리에없는 알고리즘을 제자리 안 또는 제자리라고도합니다.

위키 백과-전체 알고리즘


그렇다면 왜 mergesort가 제자리 알고리즘이 아닌 것으로 간주됩니까?
user10326

3
유용한 답변이 아닙니다. 힙 정렬과 관련이 없으며 질문에 대답하지 않습니다.
stackoverflowuser2010 년

물론 heapsort와 관련이 있습니다. 힙 정렬은 정의에서 명확해야하는 적절한 정렬 알고리즘입니다. 사실, heapsort 페이지에서 링크되었습니다.
Rein Henrichs

0

공간 요구 사항이 무시할 수 있기 때문에 제자리에있는 것으로 간주됩니다 (비트 단위 연산을 사용하여 항목을 교환하는 경우 일정하거나 전혀 없음). 예를 들어 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;
      }
}

예를 들어, 끝에서 입력 문자열을 읽고 문자를 다른 버퍼에 배치 한 경우 이는 문자열 외부 반전 알고리즘입니다.


1
Mergesort는 짜증나게 합니다. 현 위치 전략이 있다고 자신 을 잘못 설득 하기 쉽습니다 . 일반적으로 작은 배열에서만 작동합니다. 그러나 누군가 통합 정렬 알고리즘의 내부 변형을 수행 한 논문을 한 번 다운로드했다고 생각 합니다. 다시 찾을 수 있는지 살펴 보겠습니다.
Steve314
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.