[Algorithm] Heap Sort

Updated:

  • 완전 이진 트리를 기본으로 하는 힙(Heap) 자료구조를 기반으로한 정렬 방식
  • 완전 이진 트리 : 삽입할 때 왼쪽부터 차례대로 추가하는 이진 트리
  • 정렬 과정
    • 최대 힙을 구성
    • 현재 힙 루트는 가장 큰 값이 존재함. 루트의 값을 마지막 요소와 바꾼 후, 힙의 사이즈 하나 줄임
    • 힙의 사이즈가 1보다 크면 위 과정 반복

Implementation

void heapify(int* arr, int n, int i) {
	int p = i;
	int l = i * 2 + 1;
	int r = i * 2 + 2;

	if (l < n && arr[p] < arr[l]) {
		p = l;
	}

	if (r < n && arr[p] < arr[r]) {
		p = r;
	}

	if (i != p) {
		int temp = arr[p];
		arr[p] = arr[i];
		arr[i] = temp;
		heapify(arr, n, p);
	}

}

void heapSort(int* arr) {
	int n = SIZE;

	// max heap 초기화
	for (int i = n / 2 - 1; i >= 0; --i) {
		heapify(arr, n, i);
	}

	// 최대값 추출, root에서 맨 뒤에 넣고 다시 heap 생성
	for (int i = n - 1; i > 0; --i) {
		int temp = arr[0];
		arr[0] = arr[i];
		arr[i] = temp;
		heapify(arr, i, 0);
	}
}
  • Time Complexity : O(nlogn)
  • Execution Time (sec) : 0.014 (원소 30000개 기준)

C++ 코드


ref :
힙정렬

Leave a comment