μμ μ΄μ§νΈλ¦¬μ μΌμ’
.
λΆλͺ¨ λ
Έλμ μμ λ
Έλ κ°μ νΉμ ν 쑰건μ λ§μ‘±νλ μλ£κ΅¬μ‘°.
λΆλͺ¨ λ Έλ λ°μ μμ λ Έλκ° μ΅λ 2κ°κΉμ§ μμ μ μκ³ , λ§μ§λ§ λ 벨μ μ μΈν λͺ¨λ λ 벨μ λ Έλκ° μμ ν μ±μμ Έ μλ νΈλ¦¬ ꡬ쑰.
λ£¨νΈ λ
ΈλλΆν° μμνμ¬ νΈλ¦¬μ λͺ λ²μ§Έ μΈ΅μ μλμ§ λνλΈλ€.
λ£¨νΈ λ
Έλμ λ 벨 = 0
리ν λ ΈλλΆν° μμνλ©°, λ£¨νΈ λ Έλμ λμ΄λ νΈλ¦¬μ μ 체 λμ΄κ° λλ€.
μ΅λ ν(Max Heap), μ΅μ ν(Min Heap)
λͺ¨λ λΆλͺ¨ λ
Έλκ° κ·Έ μμ λ
Έλλ³΄λ€ ν¬κ±°λ κ°μ κ°μ κ°μ§λ€.
λ£¨νΈ λ
Έλλ μ 체 ν μ€μμ κ°μ₯ ν° κ°μ κ°μ§λ€.
λͺ¨λ λΆλͺ¨ λ
Έλκ° κ·Έ μμ λ
Έλλ³΄λ€ μκ±°λ κ°μ κ°μ κ°μ§λ€.
λ£¨νΈ λ
Έλλ μ 체 ν μ€μμ κ°μ₯ μμ κ°μ κ°μ§λ€.
λ£¨νΈ λ Έλκ° λ°°μ΄μ 첫 λ²μ§Έ μΈλ±μ€μ μμΉνλ€.
μΈλ±μ€κ° 1λΆν° μμνλ κ²½μ°,
i μΈλ±μ€μ μλ λ
Έλμ μΌμͺ½ μμ λ
Έλ: 2 * i μΈλ±μ€μ μμΉ
i μΈλ±μ€μ μλ λ
Έλμ μ€λ₯Έμͺ½ μμ λ
Έλ: 2 * i + 1 μΈλ±μ€μ μμΉ
package datastructure;
public class MinHeap {
public int[] heap;
public int size;
// ν κ΅¬μΆ (min heap)
public void buildMinHeap(int[] arr) {
this.size = arr.length;
this.heap = new int[size + 1]; // heap[0]μ λ―Έμ¬μ©
System.arraycopy(arr, 0, heap, 1, size); // heap[1]μ΄ root
// λΆλͺ¨ λ
Έλλ€μ μμΌλ‘ μν
// νμ κ°μ₯ λ§μ§λ§μ μμΉν λΆλͺ¨ λ
Έλμ μΈλ±μ€ = μ 체 ν μ¬μ΄μ¦ / 2
for (int i = size / 2; i >= 1; i--) {
minHeapify(i);
}
}
// heapify()
// μ΅μ νμμ λΆλͺ¨ λ
Έλκ° μμ λ
Έλλ³΄λ€ ν° κ²½μ° μμΉλ₯Ό λ°κΎΌλ€.
// μ¬κ·μ μΌλ‘ μ§ννμ¬ μ 체 νμ΄ μ΅μ νμ 쑰건μ λ§μ‘±νλλ‘ νλ€.
// μ΅μ νμ 쑰건: λͺ¨λ λΆλͺ¨ λ
Έλλ μμ λ
Έλλ³΄λ€ μκ±°λ κ°μμΌ νλ€.
// ν κ΅¬μ‘°λ‘ μ¬λ°°μ΄
public void minHeapify(int i) {
int left = 2 * i;
int right = 2 * i + 1;
int smallest;
//μΌμͺ½ μμ λ
Έλμ λΉκ΅
if (left <= size && heap[left] < heap[i]) {
smallest = left;
} else {
smallest = i;
}
//μμμ λΉκ΅ν κ°κ³Ό μ€λ₯Έμͺ½ μμ λ
Έλμ λΉκ΅
if (right <= size && heap[right] < heap[smallest]) {
smallest = right;
}
// μμ λ
Έλκ° λ μμΌλ©΄ μμΉλ₯Ό λ°κΎΈκ³ , minHeapify μ¬κ· νΈμΆ
if (smallest != i) {
swap(i, smallest);
minHeapify(smallest); // μ¬κ· νΈμΆ
}
}
// λ μμμ μμΉλ₯Ό λ°κΏ
public void swap(int i, int j) {
int temp = heap[i];
heap[i] = heap[j];
heap[j] = temp;
}
// ν λ°°μ΄ μΆλ ₯
public void printHeapArray() {
for (int i = 1; i <= size; i++) {
System.out.println(heap[i] + " ");
}
System.out.println();
}
}
ν ꡬνμ½λ νΈμΆνκΈ°
package datastructure;
public class Clientmain {
public static void main(String[] args) {
int[] heapArray = {0, 4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
MinHeap minHeap = new MinHeap();
minHeap.buildMinHeap(heapArray);
minHeap.printHeapArray();
}
}
O(log n)
heapify()κ° νμ λμ΄λ§νΌ μ¬κ·νΈμΆμ νλ€.
buildHeap() - O(n)
νμ μ½μ
/μμ μ°μ° - O(log n)
-> νΈλ¦¬μ μ¬μ λ ¬ μ§ν
μ΅λκ°/μ΅μκ° κ΅¬νλκ²½μ° - O(1)
-> νμ λ£¨νΈ κ° μ‘°ν
νμ μ΄μ©νμ¬ λ°°μ΄μ μ λ ¬νλ μκ³ λ¦¬μ¦.
μ λ ¬λμ§ μμ λ°°μ΄μ μ΅λ νμ΄λ μ΅μ μ
μΌλ‘ ꡬμ±νκ³ , λ£¨νΈ λ
Έλλ₯Ό κ°μ₯ λ§μ§λ§ λ
Έλμ κ΅νν ν ν ν¬κΈ°λ₯Ό μ€μ΄λ λ°©μ.
κ° μμκ° k μμΉλ§νΌ λ¨μ΄μ Έ μλ λ°°μ΄μΈ k-sort λ°°μ΄μ μ λ ¬ν λ κ°μ₯ ν¨μ¨μ μΈ λ°©λ²μ΄λ€.
μ΅μ
, μ΅μ μ κ²½μ°μλ νκ· O(n log n)μ μκ° λ³΅μ‘λ 보μ.
λ³λμ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νμ§ μλ μ μ리 μ λ ¬(in-place sorting) λ°©μ μ¬μ©.
-> μΌμ ν μ±λ₯μ 보μκ³Ό λμμ λ³λμ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νμ§ μλλ€.
μ«μκ° κ°μ κ²½μ°μλ μ€μμ΄ λ°μνμ¬ μμ μ μ΄μ§ μμ μ λ ¬ λ°©λ²μ΄λ€.
package datastructure;
public class HeapSort {
public void heapSort(int[] inputArray) {
MinHeap minHeap = new MinHeap();
// ν μμ±
minHeap.buildMinHeap(inputArray);
// ν μ λ ¬
int j = 0;
for (int i = minHeap.size; i >= 2; i++) {
inputArray[j] = minHeap.heap[1]; // νμ root(μ΅μκ°)μ λ°°μ΄μ μ μ₯
j++;
minHeap.swap(1, i); // νμ rootμ λ§μ§λ§ μμλ₯Ό λ°κΏ
minHeap.size--; // νμ ν¬κΈ°λ₯Ό μ€μ
minHeap.minHeapify(1); // νμ μ¬λ°°μ΄
}
// νμ λ§μ§λ§ rootκ°μ λ°°μ΄ λ§μ§λ§μ μ μ₯
inputArray[j] = minHeap.heap[1];
}
}
O(n log n)
ν μμ± - O(n)
ν μ λ ¬μμ νμμ κ°μ₯ ν°(λλ μμ) μμλ₯Ό μ κ±°νκ³ ν μ¬μ λ ¬νλ κ³Όμ μ nλ² λ°λ³΅.
μ κ±° μ°μ° - O(log n)
-> O(n log n)
=> O(n) + O(n log n) = O(n log n)