ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ํž™ ์ •๋ ฌ Heap Sort - ๋ถ€์—ฐ

NaNaRin๐Ÿ™ƒ 2021. 1. 28. 16:58

 

ํž™ ์ •๋ ฌ (Heap Sort) ์•Œ๊ณ ๋ฆฌ์ฆ˜ : 

'๋ถ€๋ชจ์˜ ๊ฐ’์ด ์ž์‹์˜ ๊ฐ’๋ณด๋‹ค ํ•ญ์ƒ ํฌ๋‹ค or ์ž‘๋‹ค' ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์™„์ „์ด์ง„ํŠธ๋ฆฌ ํž™ ์˜ ํŠน์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์ •๋ ฌ ์ˆ˜ํ–‰. 

์„ ํƒ ์ •๋ ฌ ์„ ์‘์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

 

 

 

 

๋ฉ”์†Œ๋“œ swap() : a[idx1] ๊ณผ a[idx2] ๋ฅผ ๊ตํ™˜

๋งค๊ฐœ๋ณ€์ˆ˜ : int[] a, int idx1, int idx2

 

๋ฉ”์†Œ๋“œ donwHeap() : ๋ฐฐ์—ด a์˜ index left ๋ถ€ํ„ฐ right ๊นŒ์ง€ ์š”์†Œ๋ฅผ ํž™์œผ๋กœ ๋งŒ๋“ ๋‹ค

๋งค๊ฐœ๋ณ€์ˆ˜ : int[] a, int left, int right

๋ฉ”์†Œ๋“œ heapSort() : ๊ธธ์ด๊ฐ€ n์ธ ๋ฐฐ์—ด a๋ฅผ ํž™ ์ •๋ ฌ

๋งค๊ฐœ๋ณ€์ˆ˜ : int[] a, int n

 

- ํž™ ์ •๋ ฌ :

java
๋‹ซ๊ธฐ
void swap(int[]a, int idx1, int idx2) { โ€Œint t = a[idx1]; โ€Œa[idx1] = a[idx2]; โ€Œa[idx2] = t; } void downHeap(int[] a, int left, int right) { โ€Œint temp = a[left]; โ€Œint child; โ€Œint parent; โ€Œ โ€Œfor(parent = left; parent <(right+1)/2; parent = child) { โ€Œโ€Œint cl = parent * 2 +1; โ€Œโ€Œint cr = cl + 1; โ€Œโ€Œchild = (cr <= right && a[cr] > a[cl]) ? cr : cl; โ€Œโ€Œif(temp >= a[child]) โ€Œโ€Œโ€Œbreak; โ€Œโ€Œa[parent] = a[child]; โ€Œ} โ€Œa[parent] = temp; } โ€Œ void heapSort(int[] a, int n) { โ€Œfor(int i = (n-1)/2; i >= 0; i--) โ€Œโ€ŒdownHeap(a, i, n - 1); โ€Œ โ€Œfor(int i = n-1; i > 0; i--) { โ€Œโ€Œswap(a, 0, i); โ€Œโ€ŒdownHeap(a, 0, i-1); โ€Œ} }

 

 

 

 

ํž™ ์ •๋ ฌ Heap Sort :

์ตœ์„  = O(NlogN), ํ‰๊ท  = O(NlogN), ์ตœ์•… = O(NlogN)

๋ถˆ์•ˆ์ •ํ•œ ์ •๋ ฌ