1 minute read

백준 문제 중 2751번

https://www.acmicpc.net/problem/2751

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.


플이

  1. 힙정렬

주어진 배열을 힙을 만족하는 이진트리로 구성 한뒤 계속해서 루트의 원소를 맨마지막에 저장하는 과정을 반복하는 방법이다. 여기서 힙이란 부모노드가 자식노드보다 항상 크거나 같은 혹은 작거나 같은 대소를 만족하는 완전이진트리를 말한다. 자세한 설명

from typing import MutableSequence

 # 힙정렬을 구현할 함수 선언
def heap_sort(a:MutableSequence)->None:

     # 힙 트리를 재구성하는 함수 선언
    def down_heap(a:MutableSequence,left:int,right:int)->None:
   
         # 현재 루트를 tmp에 저장
        tmp = a[left]

         # 최초 부모노드인 left를 parent에 대입
        parent = left

         # 자식이 있는 부모노드를 순회
        while parent<(right+1)//2:
            cl = parent*2+1
            cr = cl + 1
  
             # cr>right인 경우에 자식이 cl만 있는 경우이다.
            child = cr if cr<=right and a[cr]>a[cl] else cl

             # 루트의 값이 자식 둘 모두보다 클때 break
            if tmp>=a[child]:
                break

             # 자식이 루트보다 크면 서로 교환
            a[parent] = a[child]

             # 그 다음 아래 트리로 이동
            parent = child

         # 모든 부모노드 순회가 끝나면 a[left]가 마지막 원소이므로
        a[parent] = tmp


    n = len(a)

     # 가장 아래에 있는 서브트리중 오른쪽부터 가장 위 전체 트리까지 힙으로 구성
    for i in range((n-1)//2,-1,-1):
        down_heap(a,i,n-1)

     # 힙을 이용해 힙트리의 루트를 a의 맨끝에 저장하며 정렬을 완성
    for i in range(n-1,0,-1):
        a[0],a[i] = a[i],a[0]
        down_heap(a,0,i-1)

a = [10,9,8,7,6,5,4,3,2,1]
heap_sort(a)
for i in a:
    print(i)
1
2
3
4
5
6
7
8
9
10

Leave a comment