본문 바로가기

Algorithm

백준(baekjoon)(BaekJoon)코딩 2751번:힙 정렬(Heap Sort) 답

반응형

//배열의 개수를 2등분 한다. 한쪽은 배열 개수가 전체에서 2로 나눈 수, 다른 한 쪽은 전체에서 그 수를 뺀 수.

// 각각의 첫번째를 포인터로 지정한다.

// 각 []    [] 배열 끼리 최소 값을 찾는다.

// 최소값을 찾은 것 서로 비교

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <iostream>
using namespace std;
 
void swap(int* a, int* b)
{
int t = *a;
*= *b;
*= t;
}
 
void maxHeapify(int array[], int size, int index)
{
int largest = index;    // Initialize the largest as root
int left = (index << 1+ 1;   // left = 2*index + 1
int right = (index + 1<< 1;    // right = 2*index + 2
 
// See if left child of root exists and is greater than root
if (left < size && array[left] > array[largest])
largest = left;
 
// See if right child of root exists and is greater than the largest so far
if (right < size && array[right] > array[largest])
largest = right;
 
// Change root, if needed
if (largest != index)
{
swap(&array[largest], &array[index]);
maxHeapify(array, size, largest);
}
}
 
void heapSort(int array[], int size)
{
int i;
// Create an initial max heap.
// Start from bottommost and rightmost internal mode and
// heapify all internal modes in bottom up way
for (i = (size - 2/ 2; i >= 0; i--)
maxHeapify(array, size, i);
 
// Repeat reduce and heapify steps while heap size is greater than 1.
while (size > 1)
{
// The largest item in Heap is stored at the end.
swap(&array[0], &array[size - 1]);
// Reduce heap size
size--;
// Heapify the root of tree
maxHeapify(array, size, 0);
}
}
 
void printArray(int arr[], int size)
{
int i;
for (i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
 
int main(int argc, char** argv)
{
int num;
cin >> num;
int *data = new int[num];
for (int i = 0; i < num; i++)
{
cin >> data[i];
}
 
heapSort(data, num);
printArray(data, num);
 
delete[] data;
return 0;
}
cs