본문으로 바로가기

힙 정렬(Heap Sort)

category onYouTube/Algorithm 2021. 4. 3. 21:12

"힙 정렬"

     : 힙 트리 구조를 이용하는 정렬 방법

 

  • 모든 원소를 기준으로 힙 생성 알고리즘(Heapify Algorithm) 사용
  • 내림차순을 위해서는 최대 힙을, 오름차순을 위해서는 최소 힙을 구성

 

  • 시간 복잡도 : O(N * logN)
  • 항상 O(N * logN)을 보장

 

  • 병합 정렬과 퀵 정렬만큼 빠르지만, 더 우위에 있음
  • 단순히 속도만 비교하면, 퀵 정렬이 더 빠르기 때문에 일반적으로 많이 사용되지는 않음
  • 추가적인 배열이 필요하지 않기 때문에, 메모리 측면에서 몹시 효율적

 

"힙 생성 알고리즘"

     : 특정한 노드의 두 자식 중에서 더 큰 자식과 자신의 위치를 바꾸는 알고리즘

 

  • 하나의 노드에 대해서 수행
  • 하나의 노드를 제외하고는 최대 힙으로 구성되어 있는 상태라고 가정
  • 시간 복잡도 : O(logN)

 

  • "힙(Heap)" : 최소값이나 최대값을 빠르게 찾아내기 위해 완전 이진 트리를 기반으로 하는 트리
  • "최대 힙" : 부모 노드가 자식 노드보다 큰 힙

 

  • "이진 트리" : 모든 노드의 자식 노드가 2개 이하인 노드
  • "완전 이진 트리" : 데이터가 루트 노드부터 왼쪽 자식 노드, 오른쪽 자식 노드로 차근차근 들어가는 구조의 이진 트리

 

class Sort {
	
	public int[] Heap_Sort(int[] heap) {
		
		for(int i = 1; i < heap.length; i++) { // 힙을 구성
			
			int son = i;
			
			
			do { // 힙 생성 알고리즘
				
				int root = (son - 1) / 2;
				
				
				if(heap[root] < heap[son]) {
					
					int temp= heap[root];
					heap[root] = heap[son];
					heap[son] = temp;
				}
				
				
				son = root;
				
			} while (son != 0);
		}
		
		
		
		for (int i = heap.length - 1; i >= 0; i--) { // 크기를 줄여가며 반복적으로 힙을 구성
			
			int temp = heap[0];
			heap[0] = heap[i];
			heap[i] = temp;
			
			
			int root = 0;
			int son = 1;
			
			
			do { 
				son = 2 * root + 1;
				
				
				if(son < i - 1 && heap[son] < heap[son + 1]) // 자식 중에 더 큰 값을 찾기
					c++;
				
				
				if(son < i && heap[root] < heap[son]) { // 루트보다 자식이 크면 교환
					temp = heap[root];
					heap[root] = heap[son];
					heap[son] = temp;
				}
				
				
				root = son;
				
			} while (son < i);
		}
	}
}

'onYouTube > Algorithm' 카테고리의 다른 글

심화 정렬 알고리즘 문제 풀이  (0) 2021.04.04
계수 정렬(Counting Sort)  (0) 2021.04.04
C++ STL sort( ) 함수 다루기  (0) 2021.04.02
병합 정렬(Merge Sort)  (0) 2021.04.02
기초 정렬 알고리즘 문제 풀이  (0) 2021.04.02