2-1) [C] 힙 정렬(Heap Sort)

2021. 11. 8. 23:23·Algorithm/백준

1) 힙 정렬이란?

힙이라는 데이터 구조를 사용하여 정렬하는데, 최소값이나 최대값을 찾는데 최적화되어있는 완전이진트리 형태의 자료구조이다.

2) 힙 정렬의 시간복잡도

힙 정렬을 위해 n개의 숫자를 힙에 저장할 때 걸리는 시간은 O(n log n)이 된다. 1회 추가에 O(log n)의 시간이 걸리기 때문이다.

또한, 각 라운드에서 최대 숫자를 꺼내서 힙을 재구축하는 데 걸리는 시간은 O(log n)이다. 라운드 수는 n이므로 힙이 완성된 후에 정렬하는 시간도 n*O(log n)이 된다. 따라서 힙 정렬의 계산시간은 전체적으로  O(n log n)이다. 버블 정렬, 선택 정렬, 삽입 정렬의 O(n^2)에 비해 빠른 속도지만, 복잡한 데이터 구조를 구현하는 것이 어렵다.

point! 힙 정렬의 전체 시간 복잡도는 힙 생성(Heapify)알고리즘 시간 복잡도 O(log N) * 전체 데이터 수 N = O(N * logN)

 

3) 힙 정렬 구현

1. 배열을 최대 힙 구조로 변환

2. 큰 수 부터 하나씩 추출

#include <stdio.h>

int size = 8;
int heap[8] = { 6, 5, 8, 4, 1, 7, 2, 3 };

int main() {
	// 트리 구조를 최대 힙 구조로 변환
	for (int i = 1; i < size; i++) {
		int child = i;
		do {
			int root = (child - 1) / 2;
			if (heap[root] < heap[child]) {
				int temp = heap[root];
				heap[root] = heap[child];
				heap[child] = temp;
			}
			child = root;
		} while (child != 0);
	}
	// 힙 크기를 줄이면서 반복적으로 힙을 구성
	for (int i = size - 1; i >= 0; i--) {
		int temp = heap[0];
		heap[0] = heap[i];
		heap[i] = temp;
		int root = 0;
		int child = 1;
		do {
			child = 2 * root + 1;
			// 자식 중 더 큰 값을 찾기
			if (heap[child] < heap[child + 1] && child < i - 1) {
				child++;
			}
			// root보다 자식이 더 크면 교환
			if (heap[root] < heap[child] && child < i) {
				int temp = heap[root];
				heap[root] = heap[child];
				heap[child] = temp;
			}
			root = child;
		} while (child < i);
	}
	for (int i = 0; i < size; i++)
		printf("%d ", heap[i]);

	return 0;
}

결과화면

1 2 3 4 5 6 7 8

 

 

 

반응형
'Algorithm/백준' 카테고리의 다른 글
  • 2-3) [C] 퀵정렬(Quick Sort)
  • 2-2)[C] 병합 정렬(Merge Sort)
  • 2-0) [C]힙(Heap)
  • 1-3) [C]삽입정렬(Insertion Sort)
수영하는 두루미
수영하는 두루미
한국체육대학교에서 스포츠 AI빅데이터를 공부하고 있습니다. B.S. Computer Science
  • 수영하는 두루미
    두루미의 스포츠 데이터분석실
    수영하는 두루미
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • 스포츠 AI·빅데이터(2024~) (21)
        • 2024-2 (0)
        • 빅데이터기반 스포츠경기분석 (10)
        • 스포츠와 소셜텍스트분석 (4)
        • 영상기반 데이터 수집기법 (3)
        • 2025-1 (0)
        • 스포츠와 AI 모델링 기초 (0)
        • 스포츠와 프로그램 코딩(Python) (0)
        • 운동역학 (0)
        • 2025-2 (0)
        • 스포츠 AI빅데이터 연구 세미나 (1)
        • 스포츠 딥러닝 (0)
        • 운동생리학 (0)
        • etc. (0)
      • Data (13)
        • ADsP (1)
        • SQLD (1)
        • 빅데이터분석기사 (4)
        • ADP(데이터분석 전문가) (5)
        • 키다리아저씨(2021.12.05~) (2)
        • 파이썬 자격과정(2021.07.22-23) (0)
      • 정보처리기사 (1)
      • CSTS (10)
      • 블록체인과 암호화폐 (0)
        • 블록체인 (0)
      • Algorithm (44)
        • 백준 (42)
        • 자료구조 (2)
      • CSOS (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스포츠데이터
    동적테스트
    C언어
    Python
    알고리즘
    경험기반테스트
    csts
    한체대대학원
    스포츠ai빅데이터
    정적테스트
    스포츠빅데이터
    명세기반테스트
    구조기반테스트
    스포츠데이터분석
    데이터분석
    한체대
    자료구조
    빅데이터분석기사
    백준
    heapsort
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
수영하는 두루미
2-1) [C] 힙 정렬(Heap Sort)
상단으로

티스토리툴바