본문 바로가기
컴퓨터 이론/C언어 & 자료구조 & 알고리즘

51. 힙 정렬

by 컴퓨터공부용 2023. 7. 4.

힙 정렬이란?

힙 정렬은 힙 자료구조를 기반으로 한 정렬 알고리즘이다. 힙은 완전 이진트리 형태로 구성되며, 부모 노드와 자식 노드 간에 특정한 조건을 만족하는 트리이다. 힙 정렬은 주어진 리스트를 힙으로 변환한 후, 최대 힙 또는 최소 힙을 구성하여 정렬을 수행한다.

 

동작 방식

1. 주어진 리스트를 힙으로 변환한다. 이를 위해 최대 힙 또는 최소 힙으로 구성하는 고정을 수행한다.

2. 힙에서 최대(최소) 값을 추출하여 정렬된 리스트의 마지막 요소로 이동시킨다.

3. 힙의 크기가 1이 될 때까지 위 과정을 반복한다.

 

힙 정렬은 힙 자료구조를 사용하기 때문에 효율적인 정렬 알고리즘이다.

시간 복잡도는 항상 O(n log n)을 가진다. 하지만 일반적으로 다른 정렬 알고리즘보다는 느린 편에 속한다.

힙 정렬은 특히 정렬되지 않은 리스트를 한 번에 정렬해야 할 때 유용하며, 추가 메모리 공간을 요구하지 않는다.


#define SWAP(a,b,t) ((t=a), (a=b), (b=t))

// 히프 정렬 함수 
void HeapSort(int User_Data[], int n){
	int i, j, temp;
	int Heap[n+1];
	Max_Heap(User_Data, Heap, n, 1);
		
	// 랜덤으로 되어 있는 배열을 히프로 변경시킨다. 
	for(i=n/2; i>0; i--) adjust(Heap, i, n);
	
	// MAX HEAP 이므로 큰 값이 먼저 정렬된다. 
	// Heap 출력과 동일한 동작을 통해 큰값부터 정렬한다. 
	for(i=n-1; i>0; i--){
		SWAP(Heap[1], Heap[i+1], temp);
		adjust(Heap, 1, i);
	}
	
	Max_Heap(User_Data, Heap, n, 0);
}

// 히프 조정 함수 (현 배열을 히프로 만들기 위한 함수) 
void adjust(int User_Data[], int root, int n){
	int temp = User_Data[root];
	int child = 2 * root;
	
	while(child <= n){
		if((child < n) && (User_Data[child] < User_Data[child+1])) child++;
		if(temp > User_Data[child]) break;
		else{
			User_Data[child/2] = User_Data[child];
			child *= 2;
		}
	}
	User_Data[child/2] = temp;
}

// 일반 배열은 0번부터 이므로 Heap 연산을 위해 1번으로 옮기고 원상복구 시키는 함수 
void Max_Heap(int User_Data[], int Heap[], int n, int check){
	int i;
	if(check)
		for(i = 0; i<n; i++)
			Heap[i+1] = User_Data[i];
	else
		for(i = 0; i<n; i++)
			User_Data[i] = Heap[i+1];
}

'컴퓨터 이론 > C언어 & 자료구조 & 알고리즘' 카테고리의 다른 글

52. 기수 정렬  (0) 2023.07.04
50. 합병정렬  (0) 2023.07.04
49. 퀵 정렬  (0) 2023.07.04
48. 삽입정렬  (0) 2023.07.04
47. 더 나은 버블정렬  (0) 2023.07.04

댓글