CS/알고리즘 개념

힙 정렬(heap sort)

Mev01 2020. 9. 7. 14:15

힙 정렬 알고리즘 개념


과정 설명

  • 오름차순을 구성하기 위해서는 배열을 최대힙으로 구성
  • 최대 힙의 가장 첫번째 원소(배열에서 가장 큰 원소)를 하나씩 빼면서 정렬
  • 힙의 원소가 하나 남을 때까지 반복

 

과정 상세 설명

정렬할 요소들을 가지고 배열에 하나씩 요소들을 넣으면서 최대 힙 구성

정렬할 요소 (4, 3, 2, 5, 1, 6)

맨 처음 원소 삽입 과정을 따로 처리할 과정이 없으므로 생략

 

인덱스 1 2 3 4 5 6
  4 3 2      

3 삽입

인덱스 2의 부모인 1과 비교, 인덱스 1의 원소가 더 크므로 pass

2 삽입시에도 동일

 

 

인덱스 1 2 3 4 5 6
  4 3 2 5    

인덱스 1 2 3 4 5 6
  4 5 2 3    

인덱스 1 2 3 4 5 6
  5 4 2 3    

5 삽입

인덱스 4의 부모인 인덱스 2의 원소와 값 비교, 인덱스 4의 값이 더 크므로 인덱스 4와 2의 값 swap

인덱스 2의 부모인 인덱스 1과 값 비교, 인덱스 2의 값이 더 크므로 인덱스 2와 1의 값 swap

 

1 삽입시에는 문제 없으므로 pass

 

 

인덱스 1 2 3 4 5 6
  5 4 2 3 1 6

인덱스 1 2 3 4 5 6
  5 4 6 3 1 2

인덱스 1 2 3 4 5 6
  6 4 5 3 1 2

6 삽입

인덱스 6 > 인덱스 3이므로 인덱스 6과 3 swap

인덱스 3 > 인덱스 1이므로 인덱스 3과 1 swap

최대 힙 (6, 4, 5, 3, 1, 2) 완성

 

힙의 원소를 삭제하면서 정렬

인덱스 1의 원소를 인덱스 6과 swap 한 다음인덱스 6을 제외한 나머지 배열이 최대힙을 구성하도록 인덱스 1의 위치를 재조정

인덱스 1 2 3 4 5 6
  2 4 5 3 1 6

인덱스 1 2 3 4 5 6
  5 4 2 3 1 6

인덱스 1의 자식인 인덱스 2, 3과 비교해서 제일 큰 수를 인덱스 1로 올린다.

인덱스 3과 1을 swap

지금 배열에서 인덱스 6은 없는 것으로 간주하므로 인덱스 3의 자식이 없어서 여기서 종료

 

인덱스 1 2 3 4 5 6
  1 4 2 3 5 6

인덱스 1 2 3 4 5 6
  4 1 2 3 5 6

인덱스 1 2 3 4 5 6
  4 3 2 1 5 6

인덱스 1의 자식인 인덱스 2, 3과 비교해서 제일 큰 수를 인덱스 1로 올린다.

인덱스 2와 1을 swap

인덱스 2의 자식인 인덱스 4와 비교해서 (지금 배열에서 인덱스 5, 6은 없는 것으로 간주하므로) 제일 큰 수를 인덱스 2로 올린다.

인덱스 4와 2을 swap

 

인덱스 1 2 3 4 5 6
  1 2 3 4 5 6

이런 과정을 계속 거치게 되면 위와 같이 정렬된 배열이 나타나게 된다.

 

퀵 정렬 알고리즘 시간복잡도


Best: nlogn

Avg: nlogn

Worst: nlogn

 

 

References


https://gmlwjd9405.github.io/2018/05/10/algorithm-heap-sort.html

 

[알고리즘] 힙 정렬(heap sort)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

'CS > 알고리즘 개념' 카테고리의 다른 글

가장 긴 증가하는 부분 수열(LIS)  (0) 2021.05.15
수학  (0) 2020.10.24
합병 정렬(merge sort)  (0) 2020.09.05
퀵 정렬(Quick Sort)  (0) 2020.08.21
KMP 알고리즘  (0) 2020.03.01