본문 바로가기

정렬9

트리 정렬(Tree Sort) 트리 정렬(Tree Sort) 정렬되지 않은 원소들을 이진 탐색 트리(왼쪽 자식 노드에는 자신보다 작은, 오른쪽 자식 노드에는 자신보다 큰 값인 이진 트리)로 구성한 후 중위 순회 방법(현재 노드의 왼쪽 서브 트리로 이동 -> 현재 노드 -> 현재 노드의 오른쪽 서브 트리로 이동)으로 순회하면서 오름차순으로 정렬한다. ​ 시간 복잡도는 O(nlog2n)이다. ​ 예시) {57, 16, 41, 2, 50, 6, 32, 27} ​ 1. 이진 탐색 트리로 구성 57 / 27 /\ 6 41 /\. /\ 2 16 32 50 2. 중위 순회 방법으로 오름차순 정렬 {2, 6, 16, 27, 32, 41, 50, 57} ​ 프로그램 작성) package test; class TreeNode { int data; Tr.. 2021. 4. 2.
힙 정렬(Heap Sort) 힙 정렬(Heap Sort) 힙 자료구조를 이용하여 정렬. 힙은 완전 이진 트리에 있는 노드 중 키 값이 가장 큰 노드나 가장 작은 노드를 찾기 위해 만들어진 자료구조이다. 키 값이 가장 큰 노드를 찾기 위한 최대 힙(부모 키 >= 자식 키)을 이용해서 내림차순으로 정렬된 원소를 얻을 수 있고, 키 값이 가장 작은 노드를 찾기 위한 최소 힙(부모 키 0; i--) { swap(a, 0, i); // 교환 후 최대힙 재구성 makeHeap(a, i); } } public void makeHeap(int[] a, int num) { for(int i=1; i 0) { int parent = (child-1)/2; if(a[child] > a[parent]) { swap(a, parent, child); } .. 2021. 4. 2.
기수 정렬(Radix Sort) 기수 정렬(Radix Sort) 정렬할 원소의 키 값에 해당하는 버킷(bucket)에 원소를 분배했다가 순서대로 꺼내는 방법으로 정렬. 기수만큼의 버킷이 필요하다. 기수란 즉 '자릿수'이므로 10진수 원소들을 정렬할 때는 0~9 까지의 10개의 버킷을 사용한다. 일의 자리에 대해서 정렬한 후 십의 자리에 대해 정렬 그 다음은 백의 자리에 대해서 정렬하는 방법을 이용한다. ​ 정렬할 원소의 수 n과 키 값의 자릿수 d와 버킷의 수를 결정하는 기수 r에 따라 수행시간이 달라진다. 시간 복잡도는 O(d(n+r))이 된다. ​ 예시) {57, 16, 41, 2, 50, 6, 32, 31} ​ 1. 0~9 까지의 10개의 버킷을 만든다. 버킷 0 ---- [ ] 버킷 1 ---- [ ] 버킷 2 ---- [ ] .. 2021. 4. 2.
병합 정렬(Merge Sort) 병합 정렬(Merge Sort) 정렬된 여러 집합을 결합하여 하나의 정렬된 집합으로 만드는 방법. 전체 원소를 부분집합으로 분할하고 각 부분집합에 대해 정렬 작업을 한 뒤 다시 결합한다. 2개의 정렬된 부분집합을 결합하여 하나의 집합으로 만드는 방법을 2-way 병합 정렬이라 하고 n개의 정렬된 부분집합을 결합하여 하나의 집합으로 만드는 방법을 n-way 병합 정렬이라 한다. ​ 시간 복잡도는 O(nlog2n)이다. ​ 2-way 병합 정렬 예시) {57, 16, 41, 2, 50, 6, 32, 27} ​ 1. 정렬할 집합에 대해서 원소가 하나씩 남을 때까지 분할한다. {57} {16} {41} {2} {50} {6} {32} {27} ​ 2. 부분집합 2개를 정렬하면서 병합한다. 8개의 부분집합이 1개.. 2021. 4. 2.
셸 정렬(Shell Sort) 셸 정렬(Shell Sort) 일정한 간격인 원소들끼리 부분집합으로 묶어 삽입 정렬을 수행하는 작업을 반복하면서 정렬. 삽입 정렬보다 비교, 교환 연산을 줄일 수 있다. 일정한 간격은 매개 변수로 받으며 일반적으로 전체 원소 수의 1/2로 설정하고, 단계를 반복할 때마다 절반으로 감소시키면서 반복한다. ​ 매개변수의 영향으로 인해 성능 분석이 쉽지 않지만 일반적으로 시간 복잡도를 O(n^1.25)로 측정한다. ​ 예시) {57, 16, 41, 2, 50, 6, 32, 27} ​ 1. 일정한 간격을 원소 수의 절반인 4로 설정하고 그에 해당하는 부분집합끼리 삽입 정렬을 수행한다. {57, 16, 41, 2, 50, 6, 32, 27} ===> 57과 50을 삽입 정렬 {50, 16, 41, 2, 57, 6.. 2021. 4. 2.
삽입 정렬(Insert Sort) 삽입 정렬(Insert Sort) 삽입 정렬은 정렬이 되어 있는 부분집합(Sorted)과 정렬이 되어 있지 않은 부분집합(Unsorted)으로 나누어 정렬이 되어 있는 부분집합에 새로운 원소의 위치를 찾아 '삽입'하여 정렬한다. 첫 번째 원소를 정렬 되어 있는 부분집합으로 시작하고, 정렬되지 않은 부분집합에서 원소를 정렬 되어 있는 부분집합 마지막 원소부터 비교하여 위치를 찾는다. ​ 평균 비교 횟수는 n(n-1)/4 이고 평균 시간 복잡도는 O(n^2)이다. ​ 예시) {57, 16, 41, 2, 50} 하나의 집합이지만 편의상 나눠서 설명. ​ 1. 첫 번째 원소를 정렬된 부분집합 S로 정하고 나머지 부분집합 U의 첫 번째 원소를 비교하여 위치를 찾아 삽입한다. S = {57} U = {16, 41,.. 2021. 4. 2.
퀵 정렬(Quick Sort) 퀵 정렬(Quick Sort) 기준값(일반적으로 전체 원소중 가운데 위치한 원소) 피봇(povot)을 중심으로 왼쪽 부분 집합과 오른쪽 부분 집합으로 분할하고 기준값보다 작은 원소들은 왼쪽 부분집합으로, 큰 원소들은 오른쪽 부분집합으로 정렬한다. 왼쪽 끝에서 오른쪽으로 이동하면서 피봇보다 크거나 같은 원소를 찾아 L이라 하고, 오른쪽 끝에서 왼쪽으로 이동하면서 피봇보다 작은 원소를 찾아 R이라 한 후 두 원소를 교환한다. L과 R이 만나면 피봇과 교환한 후 위치를 확정한다. 확정된 피봇의 위치를 기준으로 왼쪽, 오른쪽 부분집합에 대해서 퀵 정렬을 반복한다. 부분집합의 크기가 1 이하가 되면 종료한다. ​ 퀵 정렬은 버블 정렬과 같이 교환 방식의 정렬이지만 버블 정렬은 원소가 이동할 때 한칸씩 이동하는 반.. 2021. 4. 2.
버블 정렬(Bubble Sort) 버블 정렬(Bubble Sort) '인접'한 두개의 원소를 비교하여 자리를 교환하는 방식으로 정렬. 처음부터 마지막 원소까지 반복하면서 가장 큰 원소가 마지막으로 정렬된다. ​ 평균 비교 횟수와 평균 자리 교환 횟수는 n(n-1)/2 이다. 따라서 시간 복잡도는 O(n^2)가 된다. ​ 예시) {57, 16, 41, 2, 50, 6} ​ 1. 인접한 두 원소를 비교하여 자리를 교환하는 작업을 마지막 원소까지 반복하여 가장 큰 원소를 마지막 자리로 옮긴다. {57, 16, 41, 2, 50, 6} ===> {16, 57, 41, 2, 50, 6} ===> {16, 41, 57, 2, 50, 6} ===> {16, 41, 2, 57, 50, 6} ===> {16, 41, 2, 50, 57, 6} ===> {.. 2021. 4. 2.
선택 정렬(Selection Sort) 선택 정렬(Selection Sort) 기준 위치에 맞는 원소를 '선택'하여 자리를 교환하는 방식으로 정렬. ​ 전체 비교 횟수는 n개의 원소에 대해 n(n-1)/2 이고, 어떤 경우에서나 비교 횟수가 같기 때문에 시간 복잡도는 O(n^2)이다. ​ 예시) {57, 16, 41, 2, 50, 6} ​ 1. 첫 번째 자리를 기준 위치로 정한 후 가장 작은 원소를 선택하여 자리를 바꾼다. {57, 16, 41, 2, 50, 6} 기준 위치 가장 작은 원소 2 ====> {2, 16, 41, 57, 50, 6} ​ 2. 두 번째 자리를 기준 위치로 정한 후 가장 작은 원소를 선택하여 자리를 바꾼다. {2, 16, 41, 57, 50, 6} 기준 위치 가장 작은 원소 6 ====> {2, 6, 41, 57, 5.. 2021. 4. 2.