힙은 최솟값이나 최댓값을 빠르게 찾아내기 위해 완전 이진 트리를 기반으로 하는 트리이다. 힙에는 최대 힙과 최솟 값이 존재하는데 최대 힙은 '부모 노드'가 '자식 노드'보다 큰 힙이다.
힙정렬을 하기 위해서는 기본적으로 힙 구조를 가지도록 해야한다.
Heapify Algorithm를 수행해주면 전체 트리가 최대 힙 구조로 형성된다.
static void heapify(int[] arr, int left, int right){
//부모노드랑 자식노드 비교해서 자식노드가 더 크면 바꾸기
int tmp = arr[left];
int parent;
int child; //자식 노드중 큰거
for(parent=left; parent<(right+1)/2; parent = child){ //right의 부모노드까지
int cl = (parent*2+1);
int cr = (parent*2+2);
child = (cl > cr) ? cl : cr;
if(arr[parent] > arr[child])
break;
swap(arr, parent, child);
}
}
static void heapSort(int[] a, int n){
//heapify를 이용해 힙 구조 만들기
for(int i=(n-1)/2; i<=0; i--) // a[i] ~ a[n-1]를 힙으로 만들기 i=4,3,2,1,0 //i=(n-1)/2 자식노드 있는데 까지만 부르는거 아닌가...? 그러면 (n-2)/2 아니야?
heapify(a, i, n-1);
//루트와 맨마지막 요소를 바꿔서 힙 정렬로 바꾸기
for(int i=n-1; i<0; i--){
swap(a, 0, i);
heapify(a, 0, i-1);
}
}
대소관계를 판단하지 않고 빠르게 정렬할 수 있는 알고리즘
다중 프로그래밍이란 ?
여러 개의 작업들이 메모리에 있고 CPU는 이들 사이를 오가며 실행해 줌으로써 가능한 좋은 결과를 얻고자 하는것
프로세스가 하나 만들어진다는 것은 곧, 그 프로세스에 대한 모든 것을 표현하는 PCB 하나가 만들어진다는 말과 같다.
프로세스의 상태
GSAT , OS, 스프링, 알고리즘, 영어..ㅠ
그리디, 탐색, 기본 동적 프로그래밍만 열심히 하래 기본만
코드업 기본 100제 풀어보기
백준 - 그리디 알고리즘부터 풀기, 그 다음 탐색, 기본 동적 50문제씩 풀어보기
프로그래머스에 카카오 코딩 테스트도 있대