#1 μκ³ λ¦¬μ¦
#1-1
ν(heap)μ΄λΌλ μμ΄ λ¨μ΄μ μ¬μ μ μλ―Έλ μμ λμ 무λκΈ°λ€. κ·Έλ¦¬κ³ μ΄ λ¨μ΄λ νλ‘κ·Έλλ°μμλ μ¬μ©λλ€. μ²«μ§Έλ‘ λ©λͺ¨λ¦¬ μμμμ, λμ§Έλ‘ μλ£κ΅¬μ‘°μμλ€. μ΄ λμ μλ‘ λ€λ₯Έ κ°λ μ΄μ§λ§, ν(heap)μ΄λΌλ λ¨μ΄λ₯Ό μ΄ λ§νΌ κ°κ° νμ μ¬μ μ μλ―Έμ κ΄λ ¨λ λ΄μ©μ΄ μλ€. λ©λͺ¨λ¦¬ μμμμμ νμ 무λκΈ°λΌλ λμμ€λ₯Ό νκΈ΄λ€. νλ‘κ·Έλ¨ μν λμ€ κ·Έ ν¬κΈ°κ° λ³νμ§ μλ μ μ ν λΉκ³Ό λ¬λ¦¬ λμ ν λΉμ νμν λ§νΌ ν¬κΈ°κ° 무λκΈ°λ‘ μ¦κ°ν μ μκΈ° λλ¬Έμ΄λ€. μλ£κ΅¬μ‘°μμμ νμ '무λκΈ°'κΈ° 보λ¨, μμμ΄λΌλ μλ―Έκ° κ°μ‘°λλ€. λ Έλκ° νΉμ ν κ·μΉμ μ§ν€λ©° 차곑차곑 μμ΄λ λͺ¨μ΅μμ νμ΄λΌλ μ΄λ¦μ΄ λΆμλ€.
#1-2
ν μ λ ¬μ μλ£κ΅¬μ‘°μμμ νμ μ΄μ©νλ μ λ ¬μ΄λ€. μλ£κ΅¬μ‘°μμμ νμ μ΅μ νκ³Ό μ΅λ ν 2κ°μ§ μ’ λ₯κ° μλ€. ν μ λ ¬μ λ ν μ€ μ΄λ κ²μ μ¬μ©ν΄λ λλ€. μ΄ κΈμμλ μ΅μ νμ μ΄μ©ν΄ ν μ λ ¬μ μννλ€.
#1-3
ν μ λ ¬μ 본격μ μΌλ‘ μ€λͺ νκΈ° μμ, νμ μ΄μ©ν΄μ μ λ ¬ν μ μλ μ΄μ κ° λ¬΄μμΈμ§ μ§κ³ λμ΄κ°λ€. κ·Έκ²μ νμ΄ κ°μ§ 2κ°μ§ νΉμ± λλΆμ΄λ€. μ²«μ§Έλ‘ νμ μμ μ΄μ§ νΈλ¦¬λ‘, λΆμμ μ΄μ§ νΈλ¦¬ λλΉ μ λ³΄κ° μλ λΉ κ³΅κ°μ΄ μλ€. λ°λΌμ, λ©λͺ¨λ¦¬ 곡κ°μ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μλ€. λμ§Έλ‘ μ΄μ§ νμ λ£¨νΈ λ Έλκ° νμ μ΅μκ°(μ΅μ ν) λλ μ΅λκ°(μ΅λ ν)μ κ°μ§λ€. κ·Έλ κΈ°μ, μ ν μ λ ¬μ μ리(κ° νλλ₯Ό 'μ ν'ν΄μ, λ€μͺ½μ 차곑차곑 μμ)λ₯Ό μμ©ν μ μλ€.
#1-4
μμ μ΄μ§ νΈλ¦¬λ λ€μκ³Ό κ°μ΄ λ°°μ΄λ‘ μΉνν΄ μκ°ν μ μκ³ , λ°λ λ°©ν₯μΌλ‘λ κ°λ₯νλ€. ν μ λ ¬ μκ³ λ¦¬μ¦μμλ μ£Όμ΄μ§ λ°°μ΄μ μμ μ΄μ§ νΈλ¦¬λ‘ μΉνν΄ μκ°νλ€.
#1-5
μμ μ΄μ§ νΈλ¦¬λ₯Ό μ΄μ§ νμΌλ‘ λ€λ¬λ κ²μ μμ μ΄λΌκ³ νννλ€. μ΄μ§ νμ 2μ’ λ₯ 'μ΅μ ν'κ³Ό 'μ΅λ ν' μ€μμ, μ΅μ νμ μ΄μ©νκΈ°λ‘ νλ€. λ°λΌμ, heapify() μν νμ array[0]λ νμ μ΅μκ°μ΄λ€. μ΄κ±Έ maxIndexλ‘ λ³΄λ΄λ©΄ κ³Όμ μ λ°λ³΅νλ©΄, κ²°κ³Όμ μΌλ‘ arrayλ λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬λλ€.
#1-6
μ΄μ§ νμμ μμμ μ½μ λλ μμ κ° λ°μνλ©΄, μ΅μ ν λλ μ΅λ νμ΄ μλ λ¨μν μμ μ΄μ§ νΈλ¦¬κ° λ μ μλ€. heapify()λ μ΄ μμ μ΄μ§ νΈλ¦¬κ° λ€μ μ΄μ§ νμ΄ λλλ‘ μμ νλ μμ μ νλ€. heapify()λ λ§€λ¬λ¦° λ μλΈ λ Έλ (2κ°μ μμ λ Έλ)κ° μ΄μ§ νμ λ§μ‘±νλ€λ μ μ νμ μ¬μ©νλ ν¨μλ€. λ°λΌμ, λ£¨νΈ λ Έλ μΈμ λ€λ₯Έ λ Έλκ° μ΄μ§ νμ λ§μ‘±νμ§ μλλ€λ©΄, heapify()λ₯Ό μ¬μ©ν΄λ μ΄μ§ νμ λ§μ‘±νλ arrayλ₯Ό 보μ₯ν μ μλ€. λ°λ©΄, buildHeap()λ heapify()λ₯Ό μμ©ν ν¨μλΌμ μ΄λ€ arrayλ₯Ό λ§€κ°λ³μλ‘ λ£λ μ΄μ§ νμΌλ‘ μμ ν΄μ λ°ννλ€.
#1-7
heapify()λ λ§€λ¬λ¦° λ μλΈ λ Έλ (2κ°μ μμ λ Έλ)κ° μ΄μ§ νμ λ§μ‘±νλ€λ μ μ νμ μ¬μ©νλ ν¨μλΌκ³ νλλ°, 리ν λ Έλλ κ·Έ μμ²΄λ‘ μ΄μ§ νμ λ§μ‘±νλ€. 리ν λ ΈλμμλΆν° μμν΄μ λ£¨νΈ λ ΈλκΉμ§ μ¬λΌκ°λ©° heapify()λ₯Ό μννλ©΄, μ€κ΅¬λλ°©μΈ λ°°μ΄μ μ΄μ§ νμ λ§μ‘±νλ λ°°μ΄λ‘ νλ°κΏ μν¬ μ μλ€. λ°λμ 리ν λ ΈλμΈ μμμ νΌν΄μ heapify()λ₯Ό μννλ€. μ΄λ μκ³ λ¦¬μ¦ μν μκ°μ λλΉλ₯Ό μ€μ΄κΈ° μν¨μΌλ‘, 리ν λ Έλλ₯Ό heapify() ν΄λ΄€μ 리ν λ Έλ μ²μ κ·Έλλ‘λ₯Ό λ±μ΄λ΄κΈ° λλ¬Έμ΄λ€.
#1-8
ν μ λ ¬ - μν€λ°±κ³Ό, μ°λ¦¬ λͺ¨λμ λ°±κ³Όμ¬μ
μν€λ°±κ³Ό, μ°λ¦¬ λͺ¨λμ λ°±κ³Όμ¬μ . ν μ λ ¬(Heap sort)μ΄λ μ΅λ ν νΈλ¦¬λ μ΅μ ν νΈλ¦¬λ₯Ό ꡬμ±ν΄ μ λ ¬μ νλ λ°©λ²μΌλ‘μ, λ΄λ¦Όμ°¨μ μ λ ¬μ μν΄μλ μ΅μ νμ ꡬμ±νκ³ μ€λ¦μ°¨μ μ λ ¬μ μν΄μ
ko.wikipedia.org
ν μ λ ¬μ μ΄ λΉκ΅ νμ κ³μ°μ ν΄λΉ λ§ν¬λ‘ λ체νλ€.
#2 μ½λ
#2-1 μλ°
public static void HeapSort(int[] array, int startIndex, int endIndex) {
int[] slicedArray = new int[endIndex - startIndex + 1];
for(int i = 0; i < slicedArray.length; i++) {
slicedArray[i] = array[startIndex + i];
}
buildHeap(slicedArray);
for(int maxIndex = (slicedArray.length - 1); maxIndex >= 1; maxIndex--) {
int temp = slicedArray[0];
slicedArray[0] = slicedArray[maxIndex];
slicedArray[maxIndex] = temp;
// maxIndexλ νΈλ¦¬μμ μ κ±°λ μ·¨κΈμ΄λ€. λ°λΌμ, maxIndex - 1κΉμ§ μμ νλ€.
heapify(slicedArray, 0, maxIndex - 1);
}
int[] reversedArray = new int[slicedArray.length];
for(int i = 0; i < reversedArray.length; i++) {
reversedArray[i] = slicedArray[slicedArray.length - 1 - i];
}
for(int i = 0; i < reversedArray.length; i++) {
array[startIndex + i] = reversedArray[i];
}
}
private static void heapify(int[] array, int rootIndex, int maxIndex) {
int left = (rootIndex * 2) + 1;
int right = (rootIndex * 2) + 2;
int smaller = -1;
// array[rootIndex]μ μμμ΄ λμΈ κ²½μ°
if(right <= maxIndex) {
if(array[left] < array[right]) {
smaller = left;
} else {
smaller = right;
}
// array[rootIndex]μ μμμ΄ μΌμͺ½ νλμΈ κ²½μ°
} else if(left <= maxIndex){
smaller = left;
// array[rootIndex]μ μμμ΄ μλ κ²½μ° (= 리ν λ
Έλ)
} else {
return;
}
// μ΅μ νμ΄λ―λ‘ array[rootIndex]κ° λ μμμΌ νλ€
if(array[smaller] < array[rootIndex]) {
// λ κ°μ μμΉ κ΅ν
int temp = array[smaller];
array[smaller] = array[rootIndex];
array[rootIndex] = temp;
// smallerλ₯Ό rootIndexλ‘ νλ heapify() μ¬κ·μ μν
heapify(array, smaller, maxIndex);
}
}
// μκ³ λ¦¬μ¦μμ μ§κ΄μ μΈ μ΄ν΄λ₯Ό μν΄ λ§€κ° λ³μμ λ£μλ maxIndexλ₯Ό ν¨μ λ΄λΆλ‘ μ΄λμμΌ°λ€.
private static void buildHeap(int[] array) {
int maxIndex = array.length - 1;
for(int i = (maxIndex / 2); i >= 0; i--) {
heapify(array, i, maxIndex);
}
}
#2-2 μ½νλ¦°
fun heapSort(array : Array<Int>, startIndex : Int, endIndex : Int) {
val slicedArray = array.sliceArray(startIndex..endIndex)
buildHeap(slicedArray)
for(maxIndex : Int in (slicedArray.size - 1) downTo 1) {
val temp = slicedArray[0]
slicedArray[0] = slicedArray[maxIndex]
slicedArray[maxIndex] = temp
// maxIndexλ νΈλ¦¬μμ μ κ±°λ μ·¨κΈμ΄λ€. λ°λΌμ, maxIndex - 1κΉμ§ μμ νλ€.
heapify(slicedArray, 0, maxIndex - 1)
}
slicedArray.reverse()
for(i : Int in 0..(slicedArray.size - 1)) {
array[startIndex + i] = slicedArray[i]
}
}
fun heapify(array: Array<Int>, rootIndex: Int, maxIndex: Int) {
val left = (rootIndex * 2) + 1
val right = (rootIndex * 2) + 2
var smaller = -1
// array[rootIndex]μ μμμ΄ λμΈ κ²½μ°
if(right <= maxIndex) {
if(array[left] < array[right]) {
smaller = left
} else {
smaller = right
}
// array[rootIndex]μ μμμ΄ μΌμͺ½ νλμΈ κ²½μ°
} else if(left <= maxIndex) {
smaller = left
// array[rootIndex]μ μμμ΄ μλ κ²½μ° (= 리ν λ
Έλ)
} else {
return
}
// μ΅μ νμ΄λ―λ‘ array[rootIndex]κ° λ μμμΌ νλ€
if(array[smaller] < array[rootIndex]) {
// λ κ°μ μμΉ κ΅ν
val temp = array[smaller]
array[smaller] = array[rootIndex]
array[rootIndex] = temp
// smallerλ₯Ό rootIndexλ‘ νλ heapify() μ¬κ·μ μν
heapify(array, smaller, maxIndex)
}
}
// μκ³ λ¦¬μ¦μμ μ§κ΄μ μΈ μ΄ν΄λ₯Ό μν΄ λ§€κ° λ³μμ λ£μλ maxIndexλ₯Ό ν¨μ λ΄λΆλ‘ μ΄λμμΌ°λ€.
fun buildHeap(array : Array<Int>) {
val maxIndex = array.size - 1
for(i : Int in (maxIndex / 2) downTo 0) {
heapify(array, i, maxIndex)
}
}
#3 μμ½
ν μ λ ¬μ, μ΄μ§ 'ν'μ λ£¨νΈ λ Έλκ° νμ μ΅μκ° λλ μ΅λκ°μ κ°μ§λ€λ κ²μ μ΄μ©νλ μΌμ’ μ μ ν μ λ ¬μ΄λ€.
#4 μ΄ κ°λ μ΄ μ¬μ©λ κΈ
11650 - μ’ν μ λ ¬νκΈ°
#1 μκ³ λ¦¬μ¦ ν μ λ ¬ (Heap Sort) #1 μκ³ λ¦¬μ¦ ν(heap)μ΄λΌλ μμ΄ λ¨μ΄μ μ¬μ μ μλ―Έλ μμ λμ 무λκΈ°λ€. κ·Έλ¦¬κ³ μ΄ λ¨μ΄λ νλ‘κ·Έλλ°μμλ μ¬μ©λλ€. μ²«μ§Έλ‘ λ©λͺ¨λ¦¬ μμμμ, λμ§Έλ‘ μλ£κ΅¬
kenel.tistory.com
'κΉ¨μ κ°λ π > μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ λ ¬ - ν΅ μ λ ¬ (Quick Sort) (0) | 2023.12.01 |
---|---|
μ λ ¬ - μ½μ μ λ ¬ (Insertion Sort) (0) | 2023.11.29 |
μ λ ¬ - λ³ν© μ λ ¬ (Merge Sort) (1) | 2023.11.14 |
μ λ ¬ - λ²λΈ μ λ ¬ (Bubble Sort) (0) | 2023.11.13 |
μ€λ³΅λ μμ κ°μ΄ μλ κ²½μ°μ μ΄μ§ νμ (Binary Search) (0) | 2023.11.07 |