1.09k likes | 1.33k Views
CHAPTER 6. 정렬 (Sort) 내부정렬. 6.1 정렬의 개요. 정렬 (Sort) : 각 레코드의 특정 부분을 키로 설정하여 키값에 따라 크기순으로 파일의 레코드를 재배열하는 것을 의미 오름차순 ( ascending ):2 개 이상의 자료를 작은 것부터 큰 순서로 정렬 내림차순 ( descending ): 큰 것부터 작은 것 순서로 재배열 키 : 자료를 정렬하는 데 사용하는 기준 값. 6.1 정렬의 개요. 정렬 장소에 따른 분류 내부 정렬 (internal sort)
E N D
CHAPTER 6 정렬(Sort) 내부정렬
6.1 정렬의 개요 • 정렬(Sort) : 각 레코드의 특정 부분을 키로 설정하여 키값에 따라 크기순으로 파일의 레코드를 재배열하는 것을 의미 • 오름차순( ascending ):2개 이상의 자료를 작은 것부터 큰 순서로 정렬 내림차순( descending ): 큰 것부터 작은 것 순서로 재배열 • 키 : 자료를 정렬하는 데 사용하는 기준 값
6.1 정렬의 개요 • 정렬 장소에 따른 분류 • 내부 정렬(internal sort) • 정렬할 자료를 메인 메모리에 올려서 정렬하는 방식 • 정렬 속도가 빠르지만 정렬할 수 있는 자료의 양이 메인 메모리의 용량에 따라 제한됨 • 외부 정렬(external sort) • 정렬할 자료를 보조 기억장치에서 정렬하는 방식 • 내부 정렬보다 속도는 떨어지지만 내부 정렬로 처리할 수 없는 대용량 자료에 대한 정렬 가능
6.1 정렬의 개요 • 정렬방식에 따른 구분 • 내부 정렬 방식 • 교환 방식: 키를 비교하고 교환하여 정렬하는 방식 • 선택 정렬, 버블 정렬, 퀵 정렬 • 삽입 방식: 키를 비교하고 삽입하여 정렬하는 방식 • 삽입 정렬, 셸 정렬 • 병합 방식: 키를 비교하고 병합하여 정렬하는 방식 • 2-way병합, n-way 병합 • 분배 방식: 키를 구성하는 값을 여러 개의 부분집합에 분배하여 정렬하는 방식 • 기수 정렬 • 선택 방식 : 이진 트리를 사용하여 정렬하는 방식 • 힙 정렬, 트리 정렬
6.1 정렬의 개요 • 외부정렬 방식 • 보조기억장치를 이용하여 정렬 • 디스크 이용 : • 2-way merge sort, k-way merge sort • 테이프 이용 : • balanced merge sort • cascade merge sort • polyphase merge sort • oscillating merge sort
6.1.2 정렬 알고리즘의 선택 • 정렬 알고리즘의 선택 정렬하는 연산은 모든 것이 알고리즘으로 구성되어있어 문제해결에 적절하고 업무의 효율성을 높이는 가장 좋은 알고리즘을 선택하기 위해 고려할사항. • 사용할 컴퓨터 시스템의 특성 • 정렬할 자료의 양(데이터 파일의 크기) :(Internal sort - External sort) • 초기 자료의 배열상태 • 키(Key) 값의 분포 상태 • 정렬에 소요되는 공간의 크기(스택 공간) 및 작업시간 • 프로그램 작성시간 • 정렬에 필요한 프로그램 사용할 컴퓨터 시스템의 특성 정렬할 자료의 양(데이터 파일의 크기) :(Internal sort - External sort) 초기 자료의 배열상태
6.2 선택 정렬(selection sort) • 선택 정렬(selection sort) • 전체 원소들 중에서 기준 위치에 맞는 원소를 선택하여 자리를 교환하는 방식으로 정렬 • n개의 레코드로부터 최소값을 찾아 첫번째 레코드로 이동 • 수행 방법 • 전체 원소 중에서 가장 작은 원소를 찾아서 선택하여 첫 번째 원소와 자리를 교환. • 두 번째로 작은 원소를 찾아 선택, 두 번째 원소와 자리를 교환. • 세 번째로 작은 원소를 찾아서 세 번째 원소와 자리를 교환. • 이 과정을 반복하면서 정렬을 완성.
6.2 선택 정렬(selection sort) • 선택 정렬 수행 과정 • 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22}의 자료들을 선택 정렬 방법으로 정렬하는 과정을 살펴보자. ① 첫 번째 자리를 기준 위치로 정하고, 전체 원소 중에서 가장 작은 원소 2를 선택하여 기준 위치에 있는 원소 69와 자리 교환
6.2 선택 정렬(selection sort) ② 두 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 8을 선택하여 기준 위치에 있는 원소 10과 자리 교환
6.2 선택 정렬(selection sort) ③ 세 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 10을 선택하여 기준 위치에 있는 원소 30과 자리 교환
6.2 선택 정렬(selection sort) ④ 네 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 16을 선택하여 기준 위치에 있는 원소 69와 자리 교환
6.2 선택 정렬(selection sort) ⑤ 다섯 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 22를 선택하여 기준 위치에 있는 원소 69와 자리 교환
6.2 선택 정렬(selection sort) ⑥ 여섯 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 30을 선택하여 기준 위치에 있는 원소 30과 자리 교환 (제자리)
6.2 선택 정렬(selection sort) ⑦ 일곱 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 31을 선택하여 기준 위치에 있는 원소 31과 자리 교환. (제자리) ⑧ 마지막에 남은 원소 69는 전체 원소 중에서 가장 큰 원소로서 이미 마지막 자리에 정렬된 상태이므로 실행을 종료하고 선택 정렬이 완성된다.
6.2 선택 정렬(selection sort) • 선택 정렬 알고리즘 분석 • 메모리 사용공간 • n개의 원소에 대하여 n개의 메모리 사용 • 비교횟수 • 1단계 : 첫 번째 원소를 기준으로 n개의 원소 비교 2단계 : 두 번째 원소를 기준으로 마지막 원소까지 n-1개의 원소 비교 3단계 : 세 번째 원소를 기준으로 마지막 원소까지 n-2개의 원소 비교 • i 단계 : i 번째 원소를 기준으로 n-i개의 원소 비교 • 어떤 경우에서나 비교횟수가 같으므로 시간 복잡도는 O(n2)
예제 5 부 정렬되지 않은 입력 화일이(17,12,37,54,34,48,21,29)로 8개의 항목이 있다. 이것을 선택 정렬(insertion sort)로 분류하면 다음과 같다. 1회전: 17 12 37 54 34 48 21 29 2회전: 12 17 37 54 34 48 21 29 3회전: 12 17 37 54 34 48 21 29 4회전: 12 17 21 54 34 48 37 29 5회전: 12 17 21 29 34 48 37 54 6회전: 12 17 21 29 34 48 37 54 7회전: 12 17 21 29 34 37 48 54 결과: 12 17 21 29 34 37 48 54
6.3 버블정렬(bubble sort) 첫 번째 원소부터 인접한 원소끼리 계속 자리를 교환하면서 맨 마지막 자리로 이동하는 모습이 물 속에서 물 위로 올라오는 물방울 모양과 같다고 하여 버블(bubble) 정렬이라 함.
6.3 버블정렬(bubble sort) • 버블 정렬(bubblesort) • 인접한 두 개의 원소를 비교하여 자리를 교환하는 방식 • 첫 번째 원소부터 마지막 원소까지 반복하여 한 단계가 끝나면 가장 큰 원소가 마지막 자리로 정렬 • 버블 정렬 수행 과정 • 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22}의 자료들을 버블 정렬 방법으로 정렬하는 과정을 살펴보자. ① 인접한 두 원소를 비교하여 자리를 교환하는 작업을 첫 번째 원소부터 마지막 원소까지 차례로 반복하여 가장 큰 원소 69를 마지막 자리로 정렬
6.3 버블정렬(bubble sort) ② 버블 정렬을 수행하여 나머지원소 중에서 가장 큰 원소 31을 끝에서 두 번째 자리로 정렬.
6.3 버블정렬(bubble sort) ③ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 30을 끝에서 세 번째 자리로 정렬.
6.3 버블정렬(bubble sort) ④ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 22를 끝에서 네 번째 자리로 정렬.
6.3 버블정렬(bubble sort) ⑤ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 16을 끝에서 다섯 번째 자리로 정렬.
6.3 버블정렬(bubble sort) ⑥ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 10을 끝에서 여섯 번째 자리로 정렬.
6.3 버블정렬(bubble sort) ⑦ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 8을 끝에서 일곱 번째 자리로 정렬. 마지막에 남은 첫 번째 원소는 전체 원소 중에서 가장 작은 원소로 이미 정렬된 상태이므로 실행을 종료하고 버블 정렬이 완성된다.
6.3 버블정렬(bubble sort) • 실행 결과
6.3 버블정렬(bubble sort) • 버블 정렬 알고리즘 분석 • 메모리 사용공간 • n개의 원소에 대하여 n개의 메모리 사용 • 연산 시간 • 최선의 경우 : 자료가 이미 정렬되어있는 경우 • 비교횟수 : i번째 원소를 (n-i)번 비교하므로, n(n-1)/2 번 • 자리교환횟수 : 자리교환이 발생하지 않는다. • 최악의 경우 : 자료가 역순으로 정렬되어있는 경우 • 비교횟수 : i번째 원소를 (n-i)번 비교하므로, n(n-1)/2 번 • 자리교환횟수 : i번째 원소를 (n-i)번 교환하므로, n(n-1)/2 번 • 평균 시간 복잡도 : O(n2)
예제 5 부 정렬되지 않은 입력 화일이(17,12,37,54,34,48,21,29)로 8개의 항목이 있다. 이것을 버블 정렬로 분류하면 다음과 같다. 1회전: 17 12 37 54 34 48 21 29 12 17 37 54 34 48 21 29 12 17 37 34 54 48 21 29 12 17 37 34 48 54 21 29 12 17 37 34 48 21 54 29 12 17 37 34 48 21 29 54 1회전이 완료되면 제일 큰 값인 54가 맨 뒤에 위치한다. 그러므로 54를 제외한 나머지 레코드를 1회전에서와 마찬가지로 인접한 레코드를 비교 교환하면서 제자리를 찾아간다. 2회전: 12 17 37 34 48 21 29 54 12 17 34 37 21 29 48 54 3회전: 12 17 34 37 21 29 48 54 12 17 34 21 29 37 48 54 4회전: 12 17 34 21 29 37 48 54 12 17 21 29 34 37 48 54 정렬은 완료되었지만 5회전, 6회전, 7회전까지 진행을 한다.
버블정렬, 선택정렬 • 단계 • 단계별로 가장 큰 것이 가장 오른쪽으로 이동한다는 점에서 동일 • 선택정렬은 가장 큰 것과 가장 오른쪽 것이 한번에 스와핑. • 버블 정렬은 가장 큰 것이 한 칸씩 오른 쪽으로 이동 • 스와핑(교환, 복사)에 걸리는 시간 • 큰 레코드에 대해서 버블 정렬은 선택 정렬보다 불리 • 이미 정렬된 데이터 • 버블 정렬이 최선의 효율 • 1단계에서 끝남. (스와핑이 전혀 없음). O(N)의 효율 • 선택 정렬은 여전히 O(N2)의 효율. • 가장 큰 데이터인 마지막 데이터가 자기 자신과 스왑(Self Swap)
6.4 삽입정렬(insertion sort) • 삽입 정렬(insert sort) • 정렬되어있는 부분집합에 정렬할 새로운 원소의 위치를 찾아 삽입하는 방법 • 정렬할 자료를 두 개의 부분집합 S와 U로 가정 • 부분집합 S: 정렬된 앞부분의 원소들 • 부분집합 U : 아직 정렬되지 않은 나머지 원소들 • 정렬되지 않은 부분집합 U의 원소를 하나씩 꺼내서 이미 정렬되어있는 부분집합 S의 마지막 원소부터 비교하면서 위치를 찾아 삽입 • 삽입 정렬을 반복 • 부분집합 S의 원소는 하나씩 늘림 • 부분집합 U의 원소는 하나씩 감소. • 부분집합 U가 공집합이 되면 삽입 정렬이 완성.
6.4 삽입정렬(insertion sort) • 삽입 정렬 수행 과정 • 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22}의 자료들을 삽입 정렬 방법. • 초기 상태 : 첫 번째 원소는 정렬되어있는 부분 집합 S로 생각 나머지 원소들은 정렬되지 않은 원소들의 부분 집합 U로 생각. S={69}, U={10, 30, 2, 16, 8, 31, 22}
6.4 삽입정렬(insertion sort) ① U의 첫 번째 원소 10을 S의 마지막 원소 69와 비교(10 < 69) 이므로 원소 10은 원소 69의 앞자리가 된다.더 이상 비교할 S의 원소가 없으므로 찾은 위치에 원소 10을 삽입. S={10, 69}, U={30, 2, 16, 8, 31, 22}
6.4 삽입정렬(insertion sort) ② U의 첫 번째 원소 30을 S의 마지막 원소 69와 비교(30 < 69) 이므로 원소 69의 앞자리 원소 10과 비교. (30 > 10) 이므로 원소 10과 69 사이에 삽입. S={10, 30, 69}, U={2, 16, 8, 31, 22}
6.4 삽입정렬(insertion sort) ③ U의 첫 번째 원소 2를 S의 마지막 원소 69와 비교하여 (2 < 69) 이므로 원소 69의 앞자리 원소 30과 비교하고, (2 < 30) 이므로 다시 그 앞자리 원소 10과 비교하는데, (2 < 10) 이면서 더 이상 비교할 S의 원소가 없으므로 원소 10의 앞에 삽입한다. S={2, 10, 30, 69}, U={16, 8, 31, 22}
6.4 삽입정렬(insertion sort) ④ U의 첫 번째 원소 16을 S의 마지막 원소 69와 비교 (16 < 69) 이므로 그 앞자리 원소 30과 비교. (16 < 30) 이므로 다시 그 앞자리 원소 10과 비교, (16 > 10)이므로 원소 10과 30 사이에 삽입한다. S={2, 10, 16, 30, 69}, U={8, 31, 22}
6.4 삽입정렬(insertion sort) ⑤ U의 첫 번째 원소 8을 S의 마지막 원소 69와 비교 (8 < 69) 이므로 그 앞자리 원소 30과 비교. (8 < 30) 이므로 그 앞자리 원소 10과 비교, (8 < 10) 이므로 다시 그 앞자리 원소 2와 비교, (8 > 2)이므로 원소 2와 10 사이에 삽입. S={2, 8, 10, 16, 30, 69}, U={31, 22}
6.4 삽입정렬(insertion sort) ⑥ U의 첫 번째 원소 31을 S의 마지막 원소 69와 비교(31 < 69) 이므로 그 앞자리 원소 30과 비교. (31 > 30) 이므로 원소 30과 69 사이에 삽입. S={2, 8, 10, 16, 30, 31, 69}, U={22}
6.4 삽입정렬(insertion sort) ⑦ U의 첫 번째 원소 22를 S의 마지막 원소 69와 비교 (22 < 69) 이므로 그 앞자리 원소 31과 비교. (22 < 31) 이므로 그 앞자리 원소 30과 비교, (22 < 30) 이므로 다시 그 앞자리 원소 16과 비교, (22 > 16) 이므로 원소 16과 30 사이에 삽입. S={2, 8, 10, 16, 22, 30, 31, 69}, U={} U가 공집합이 되었으므로 실행을 종료하고 삽입 정렬이 완성된다.
6.4 삽입정렬(insertion sort) • 삽입 정렬 알고리즘 분석 • 메모리 사용공간 • n개의 원소에 대하여 n개의 메모리 사용 • 연산 시간 • 최선의 경우 : 원소들이 이미 정렬되어있어서 비교횟수가 최소인 경우 • 이미 정렬되어있는 경우에는 바로 앞자리 원소와 한번만 비교. • 전체 비교횟수 = n-1 • 시간 복잡도 : O(n) • 최악의 경우 : 모든 원소가 역순으로 되어있어서 비교횟수가 최대인 경우 • 전체 비교횟수 = 1+2+3+ ⋯ +(n-1) = n(n-1)/2 • 시간 복잡도 : O(n2) • 삽입 정렬의 평균 비교횟수 = n(n-1)/4 • 평균 시간 복잡도 : O(n2)
6.4 삽입정렬(insertion sort) • 최악의 경우:역순으로 정렬된 상태에서의 삽입 • 최선의 경우:이미 정렬된 상태에서의 삽입
6.4 삽입정렬(insertion sort) • 실행 결과
예제 5 부 정렬되지 않은 입력 화일이(17,12,37,54,34,48,21,29)로 8개의 항목이 있다. 이것을 삽입 정렬로 분류하면 다음과 같다.
선택, 버블, 삽입 • 최악의 효율은 모두 O(N2)으로서 동일 • 버블 정렬과 삽입 정렬는 안정정렬 • 레코드들이 하나하나 순차적으로 이동(Shift)하기 때문에 원래의 순서가 유지 • 선택 정렬은 불안정 정렬 • 스왑(Swap)에 의해 단번에 멀리 떨어진 곳으로 이동
6.5 기수정렬(Radix Sort) • 기수 = 키의 구성요소. 분해된 문자열, 분해된 문자.
6.5 기수 정렬(radix sort) (계속) • 버켓 정렬(bucket sort) • 몇개의 키 K1, K2,...Kn를 갖는 레코드를 정렬하는 방법 • 사전식 정렬(lexical sort) • 버켓의 수는 키의 종류(숫자, 문자 등)에 의해 결정 • 좌선 정렬(left first sort) : • 최대유효숫자 정렬(Most Significant Digit Sort : MSD sort) • 큰 단위에서작은 단위로 키를 이동 • 우선 정렬(right first sort) : • 최소유효숫자 정렬(Least Significant Digit Sort : LSD sort) • 작은 단위에서 큰단위로 키를 이동 • 우선정렬은 각 버켓을 정렬할 필요가 없으므로 더 간단하다.
0 1 2 3 4 5 6 7 8 9 10 31 82 13 63 24 44 5 7 8 18 19 0 1 2 3 4 5 6 7 8 9 05 07 08 10 13 18 19 24 31 44 63 82 LSD 기수정렬(계속) • 우선정렬 : 원시리스트 : 7, 19, 24, 13, 31, 8, 82, 18, 44, 63, 5, 10 • 키는 두자리(K1, K2) = (10의 자리, 1의 자리) • K2 = 1의 자리 숫자에 대한 정렬 • 0번 버켓부터 FIFO방식으로 출력 • 결합 상태(K2) : R = 10, 31, 82, 13, 63, 24, 44, 5, 7, 8, 18, 19 • K1 = 10의 자리 숫자에 대한 정렬 • 0번 버켓부터 FIFO방식으로 출력 • 결합 상태(K1) : R = 5, 7, 8, 10, 13, 18, 19, 24, 31, 44, 63, 82
1 2 3 4 5 6 7 8 9 10 S D H C MSD 기수정렬(계속) • 좌선정렬 : 원시리스트 : 1H, 9C, 2D, 1S, 3H, 8H 8D, 5S, 4C, 6D • 키는 두자리(K1, K2) = (숫자, 무늬) • K1 = 숫자에 대한 정렬 • 1번 버켓부터 FIFO방식으로 출력 • 결합 상태(K1) : R = 1H, 1S, 2D, 3H, 4C, 5S, 6D, 8H, 8D, 9C • K2 = 무늬에 대한 정렬(S:스페이스, D:다이아몬드, H:하트, C:클로바) • S 버켓부터 FIFO 방식으로 출력 • 결합 상태(K2) : R = 1S, 5S, 2D, 6D, 8D, 1H, 3H, 8H, 4C, 9C 1H 1S 2D 3H 4C 5S 6D 8H 8D 9C 1S 5S 2D 6D 8D 1H 3H 8H 4C 9C
6.5 기수 정렬(radix sort) (계속) • 알고리즘 분석 • n : 레코드수 • q : 기수의 값(큐의 수) • k : 디지트 수(키의 수) • 메모리 사용 공간 : S = ( n + 1) q • 연산 시간 : O(k(n+q)) • 기억 공간의 낭비는 있지만 자리수 정렬 속도는 빠르다
6.6 2원 병합 정렬 ⑴ 분할(divide) : 입력 자료를 같은 크기의 부분집합 2개로 분할. ⑵ 정복(conquer) : 부분집합의 원소들을 정렬. 순환호출을 이용하여 다시 분할 정복 기법 적용 ⑶ 결합(combine) : 정렬된 부분집합들을 하나의 집합으로 통합 • 2원 병합 정렬의 진행 순서
6.6 2원 병합 정렬 • 병합 정렬(mergesort) • 여러 개의 정렬된 자료의 집합을 병합하여 한 개의 정렬된 집합으로 만드는 방법 • 부분집합으로 분할(divide), 각 부분집합에 대해서 정렬 작업을 완성(conquer)정렬된 부분집합들을 다시 결합(combine)분할 정복(divide and conquer) 기법 사용 • 병합 정렬 방법의 종류 • 2-way 병합 : 2개의 정렬된 자료의 집합을 결합 하나의 집합으로 만드는 병합 방법 • n-way 병합 : n개의 정렬된 자료의 집합을 결합하나의 집합으로 만드는 병합 방법