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


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.