Algorithm/06. 정렬 9

6-9. 도수 정렬(Counting Sort)

도수 정렬 요소의 대소 관계를 비교할 필요가 없음 도수분포표 작성, 누적도수분포표 작성, 목적 배열 만들기, 배열 복사의 4단계로 이루어짐 [10점 만점의 테스트에서 학생 9명의 점수 도수 정렬] 1단계. 도수분포표 만들기 학생 점수 배열 a를 바탕으로 '각 점수에 해당하는 학생이 몇 명인지'를 나타내는 도수분포표 작성 모든 요소의 값을 초기화한 배열 f에 배열 a를 처음부터 스캔하면서 도수분포표 작성 예를 들어, a[0]이 5점이면 f[5]를 1만큼 증가시키고 a[1]이 7점인 경우 f[7]을 1만큼 증가시키는 작업을 반복 for(int i = 0; i < n; i++) f[a[i]]++; 2단계. 누적도수분포표 만들기 '0점부터 점수 n까지 몇 명의 학생이 있는지' 누적된 값을 나타내는 누적도수분포표..

6-8. 힙 정렬(Heap Sort)

힙이란?힙(heap)을 사용해 정렬하는 알고리즘힙은 '부모의 값이 자식보다 항상 크다(우선순위가 높다)'는 조건을 만족하는 완전이진트리부모의 값이 자식보다 항상 작아도 힙이라고 함(부모와 자식 요소의 관계만 일정하면 됨) 👆 완전이진트리부모는 자식을 왼쪽부터 추가하며(완전), 부모가 가질 수 있는 자식의 개수가 최대 2개(이진)인 트리 완전이진트리 → 힙 전환 힙은 루트가 가장 큰(혹은 작은) 값이어야 함즉, 모든 부모와 자식의 관계는 항상 부모의 값 >= 자식의 값이 성립되어야 함힙에서 부모와 자식 관계는 일정하지만 형제 사이의 대소 관계는 일정하지 않음 힙의 요소를 배열에 저장 힙의 요소를 배열에 저장하면 부모와 자식의 인덱스 사이에는 다음과 같은 관계 성립1. 부모는 a[(child..

6-7. 병합 정렬(Merge Sort)

정렬을 마친 배열의 병합 : 정렬을 마친 각 배열에서 선택한 요소의 값을 비교해 작은 값의 요소를 꺼내 새로운 배열에 넣는 작업을 반복하여 정렬 [그림] 배열 a와 b를 앞에서부터 차례로 비교하여 작은 값을 꺼내 비에 넣음 [실습 코드] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 static void merge(int[] a, int na, int[] b, int nb, int[] c) { int pa = 0; int pb = 0; int pc = 0; while(pa

6-6. 퀵 정렬(Quick Sort)

퀵 정렬 살펴보기 가장 빠른 정렬 알고리즘 중 하나 피벗 설정과 그룹 나눔을 반복해 모든 그룹의 요소가 한 개가 되면 정렬을 마침 피벗은 마음대로 선택 가능, 양쪽 그룹 어느 곳에 포함시켜도 상관 없음 배열을 두 그룹으로 나누기 피벗: x 왼쪽 커서: pl 오른쪽 커서: pr ※ 피벗 이하의 요소를 배열 왼쪽으로, 이상의 요소를 배열 오른쪽으로 옮기기 위해 수행해야 할 작업 1. a[pl] >= x가 성립하는 요소를 찾을 때까지 pl을 오른쪽으로 스캔 2. a[pr] pr + 1인 경우에는 다음과 같은 그룹이 생길 수 있음 피버새과 일치하는 값을 가지는 그룹: a[pr + 1], ..., a[pl - 1] [실습 코드] 1 2 3 4 5 6 7 do { while(a[pl] x) pr--; if(pl

6-5. 셸 정렬(Shell Sort)

단순 삽입 정렬의 특징 a. 정렬을 마쳤거나 정렬을 마친 상태에 가까우면 정렬 속도가 매우 빨라진다(장점) b. 삽입할 위치가 멀리 떨어져 있으면 이동(대입)해야 하는 횟수가 많아진다(단점) 셸 정렬은 이러한 단순 삽입 정렬의 장점을 살리고 단점은 보완한 알고리즘이다. 셸 정렬 : 단순 삽입 정렬의 장점(a)은 살리고 단점(b)은 보완한 정렬 알고리즘으로, 도널드 셸(D. L. Shell)이 고안 먼저, 정렬할 배열의 요소를 그룹으로 나눠 각 그룹 별로 단순 삽입 정렬을 수행 각 그룹을 합치면서 정렬을 반복해 요소의 이동 횟수를 줄임 [예시] 먼저, 배열을 ※4개의 그룹으로 나누고 각 그룹별로 정렬 (4-정렬) ※4칸씩 떨어져있는 요소들로 묶음({8, 7}, {1, 6}, {4, 3}, {2, 5}) 4..