Algorithm

힙 정렬

할루루 2018. 3. 1. 15:40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
func heapify(array: inout [Int], index: Int, size: Int){
    var largest: Int = index
    let leftIndex = index * 2 + 1
    let rightIndex = index * 2 + 2
    if(leftIndex < size && array[leftIndex] > array[largest]){
        largest = leftIndex
    }
    if(rightIndex < size && array[rightIndex] > array[largest]){
        largest = rightIndex
    }
    if(largest != index){
        let temp = array[largest]
        array[largest] = array[index]
        array[index] = temp
        heapify(array: &array, index: largest, size: size)
    }
}
 
func heapSort(array: inout [Int]){
    let size = array.count
    for i in stride(from: size / 2 - 1, through: 0, by: -1){
        heapify(array: &array, index: i, size: size)
    }
    for i in stride(from: size - 1, through: 0, by: -1){
        let temp = array[0]
        array[0= array[i]
        array[i] = temp
        heapify(array: &array, index: 0, size: i)
    }
}
cs



heapify 함수는 주어진 인덱스부터 트리를 타고 내려가면서 힙 성질을 만족하게 하는 함수이다.


heapSort 함수의 첫 번째 for문에 의하여 max heap이 만들어지고 내림차순 정렬이 된다.


아래의 for문에 의해 오름차순 정렬된 결과가 나온다.