1 / 109

CHAPTER 6

CHAPTER 6. 정렬 (Sort) 내부정렬. 6.1 정렬의 개요. 정렬 (Sort) : 각 레코드의 특정 부분을 키로 설정하여 키값에 따라 크기순으로 파일의 레코드를 재배열하는 것을 의미 오름차순 ( ascending ):2 개 이상의 자료를 작은 것부터 큰 순서로 정렬 내림차순 ( descending ): 큰 것부터 작은 것 순서로 재배열 키 : 자료를 정렬하는 데 사용하는 기준 값. 6.1 정렬의 개요. 정렬 장소에 따른 분류 내부 정렬 (internal sort)

Download Presentation

CHAPTER 6

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CHAPTER 6 정렬(Sort) 내부정렬

  2. 6.1 정렬의 개요 • 정렬(Sort) : 각 레코드의 특정 부분을 키로 설정하여 키값에 따라 크기순으로 파일의 레코드를 재배열하는 것을 의미 • 오름차순( ascending ):2개 이상의 자료를 작은 것부터 큰 순서로 정렬 내림차순( descending ): 큰 것부터 작은 것 순서로 재배열 • 키 : 자료를 정렬하는 데 사용하는 기준 값

  3. 6.1 정렬의 개요 • 정렬 장소에 따른 분류 • 내부 정렬(internal sort) • 정렬할 자료를 메인 메모리에 올려서 정렬하는 방식 • 정렬 속도가 빠르지만 정렬할 수 있는 자료의 양이 메인 메모리의 용량에 따라 제한됨 • 외부 정렬(external sort) • 정렬할 자료를 보조 기억장치에서 정렬하는 방식 • 내부 정렬보다 속도는 떨어지지만 내부 정렬로 처리할 수 없는 대용량 자료에 대한 정렬 가능

  4. 6.1 정렬의 개요 • 정렬방식에 따른 구분 • 내부 정렬 방식 • 교환 방식: 키를 비교하고 교환하여 정렬하는 방식 • 선택 정렬, 버블 정렬, 퀵 정렬 • 삽입 방식: 키를 비교하고 삽입하여 정렬하는 방식 • 삽입 정렬, 셸 정렬 • 병합 방식: 키를 비교하고 병합하여 정렬하는 방식 • 2-way병합, n-way 병합 • 분배 방식: 키를 구성하는 값을 여러 개의 부분집합에 분배하여 정렬하는 방식 • 기수 정렬 • 선택 방식 : 이진 트리를 사용하여 정렬하는 방식 • 힙 정렬, 트리 정렬

  5. 6.1 정렬의 개요 • 외부정렬 방식 • 보조기억장치를 이용하여 정렬 • 디스크 이용 : • 2-way merge sort, k-way merge sort • 테이프 이용 : • balanced merge sort • cascade merge sort • polyphase merge sort • oscillating merge sort

  6. 6.1.2 정렬 알고리즘의 선택 • 정렬 알고리즘의 선택 정렬하는 연산은 모든 것이 알고리즘으로 구성되어있어 문제해결에 적절하고 업무의 효율성을 높이는 가장 좋은 알고리즘을 선택하기 위해 고려할사항. • 사용할 컴퓨터 시스템의 특성 • 정렬할 자료의 양(데이터 파일의 크기) :(Internal sort - External sort) • 초기 자료의 배열상태 • 키(Key) 값의 분포 상태 • 정렬에 소요되는 공간의 크기(스택 공간) 및 작업시간 • 프로그램 작성시간 • 정렬에 필요한 프로그램 사용할 컴퓨터 시스템의 특성 정렬할 자료의 양(데이터 파일의 크기) :(Internal sort - External sort) 초기 자료의 배열상태

  7. 6.2 선택 정렬(selection sort) • 선택 정렬(selection sort) • 전체 원소들 중에서 기준 위치에 맞는 원소를 선택하여 자리를 교환하는 방식으로 정렬 • n개의 레코드로부터 최소값을 찾아 첫번째 레코드로 이동 • 수행 방법 • 전체 원소 중에서 가장 작은 원소를 찾아서 선택하여 첫 번째 원소와 자리를 교환. • 두 번째로 작은 원소를 찾아 선택, 두 번째 원소와 자리를 교환. • 세 번째로 작은 원소를 찾아서 세 번째 원소와 자리를 교환. • 이 과정을 반복하면서 정렬을 완성.

  8. 6.2 선택 정렬(selection sort) • 선택 정렬 수행 과정 • 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22}의 자료들을 선택 정렬 방법으로 정렬하는 과정을 살펴보자. ① 첫 번째 자리를 기준 위치로 정하고, 전체 원소 중에서 가장 작은 원소 2를 선택하여 기준 위치에 있는 원소 69와 자리 교환

  9. 6.2 선택 정렬(selection sort) ② 두 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 8을 선택하여 기준 위치에 있는 원소 10과 자리 교환

  10. 6.2 선택 정렬(selection sort) ③ 세 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 10을 선택하여 기준 위치에 있는 원소 30과 자리 교환

  11. 6.2 선택 정렬(selection sort) ④ 네 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 16을 선택하여 기준 위치에 있는 원소 69와 자리 교환

  12. 6.2 선택 정렬(selection sort) ⑤ 다섯 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 22를 선택하여 기준 위치에 있는 원소 69와 자리 교환

  13. 6.2 선택 정렬(selection sort) ⑥ 여섯 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 30을 선택하여 기준 위치에 있는 원소 30과 자리 교환 (제자리)

  14. 6.2 선택 정렬(selection sort) ⑦ 일곱 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 31을 선택하여 기준 위치에 있는 원소 31과 자리 교환. (제자리) ⑧ 마지막에 남은 원소 69는 전체 원소 중에서 가장 큰 원소로서 이미 마지막 자리에 정렬된 상태이므로 실행을 종료하고 선택 정렬이 완성된다.

  15. 6.2 선택 정렬(selection sort) • 선택 정렬 알고리즘 분석 • 메모리 사용공간 • n개의 원소에 대하여 n개의 메모리 사용 • 비교횟수 • 1단계 : 첫 번째 원소를 기준으로 n개의 원소 비교 2단계 : 두 번째 원소를 기준으로 마지막 원소까지 n-1개의 원소 비교 3단계 : 세 번째 원소를 기준으로 마지막 원소까지 n-2개의 원소 비교 • i 단계 : i 번째 원소를 기준으로 n-i개의 원소 비교 • 어떤 경우에서나 비교횟수가 같으므로 시간 복잡도는 O(n2)

  16. 예제 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

  17. 6.3 버블정렬(bubble sort) 첫 번째 원소부터 인접한 원소끼리 계속 자리를 교환하면서 맨 마지막 자리로 이동하는 모습이 물 속에서 물 위로 올라오는 물방울 모양과 같다고 하여 버블(bubble) 정렬이라 함.

  18. 6.3 버블정렬(bubble sort) • 버블 정렬(bubblesort) • 인접한 두 개의 원소를 비교하여 자리를 교환하는 방식 • 첫 번째 원소부터 마지막 원소까지 반복하여 한 단계가 끝나면 가장 큰 원소가 마지막 자리로 정렬 • 버블 정렬 수행 과정 • 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22}의 자료들을 버블 정렬 방법으로 정렬하는 과정을 살펴보자. ① 인접한 두 원소를 비교하여 자리를 교환하는 작업을 첫 번째 원소부터 마지막 원소까지 차례로 반복하여 가장 큰 원소 69를 마지막 자리로 정렬

  19. 6.3 버블정렬(bubble sort)

  20. 6.3 버블정렬(bubble sort) ② 버블 정렬을 수행하여 나머지원소 중에서 가장 큰 원소 31을 끝에서 두 번째 자리로 정렬.

  21. 6.3 버블정렬(bubble sort) ③ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 30을 끝에서 세 번째 자리로 정렬.

  22. 6.3 버블정렬(bubble sort) ④ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 22를 끝에서 네 번째 자리로 정렬.

  23. 6.3 버블정렬(bubble sort) ⑤ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 16을 끝에서 다섯 번째 자리로 정렬.

  24. 6.3 버블정렬(bubble sort) ⑥ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 10을 끝에서 여섯 번째 자리로 정렬.

  25. 6.3 버블정렬(bubble sort) ⑦ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 8을 끝에서 일곱 번째 자리로 정렬. 마지막에 남은 첫 번째 원소는 전체 원소 중에서 가장 작은 원소로 이미 정렬된 상태이므로 실행을 종료하고 버블 정렬이 완성된다.

  26. 6.3 버블정렬(bubble sort) • 실행 결과

  27. 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)

  28. 예제 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회전까지 진행을 한다.

  29. 버블정렬, 선택정렬 • 단계 • 단계별로 가장 큰 것이 가장 오른쪽으로 이동한다는 점에서 동일 • 선택정렬은 가장 큰 것과 가장 오른쪽 것이 한번에 스와핑. • 버블 정렬은 가장 큰 것이 한 칸씩 오른 쪽으로 이동 • 스와핑(교환, 복사)에 걸리는 시간 • 큰 레코드에 대해서 버블 정렬은 선택 정렬보다 불리 • 이미 정렬된 데이터 • 버블 정렬이 최선의 효율 • 1단계에서 끝남. (스와핑이 전혀 없음). O(N)의 효율 • 선택 정렬은 여전히 O(N2)의 효율. • 가장 큰 데이터인 마지막 데이터가 자기 자신과 스왑(Self Swap)

  30. 6.4 삽입정렬(insertion sort) • 삽입 정렬(insert sort) • 정렬되어있는 부분집합에 정렬할 새로운 원소의 위치를 찾아 삽입하는 방법 • 정렬할 자료를 두 개의 부분집합 S와 U로 가정 • 부분집합 S: 정렬된 앞부분의 원소들 • 부분집합 U : 아직 정렬되지 않은 나머지 원소들 • 정렬되지 않은 부분집합 U의 원소를 하나씩 꺼내서 이미 정렬되어있는 부분집합 S의 마지막 원소부터 비교하면서 위치를 찾아 삽입 • 삽입 정렬을 반복 • 부분집합 S의 원소는 하나씩 늘림 • 부분집합 U의 원소는 하나씩 감소. • 부분집합 U가 공집합이 되면 삽입 정렬이 완성.

  31. 6.4 삽입정렬(insertion sort) • 삽입 정렬 수행 과정 • 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22}의 자료들을 삽입 정렬 방법. • 초기 상태 : 첫 번째 원소는 정렬되어있는 부분 집합 S로 생각 나머지 원소들은 정렬되지 않은 원소들의 부분 집합 U로 생각. S={69}, U={10, 30, 2, 16, 8, 31, 22}

  32. 6.4 삽입정렬(insertion sort) ① U의 첫 번째 원소 10을 S의 마지막 원소 69와 비교(10 < 69) 이므로 원소 10은 원소 69의 앞자리가 된다.더 이상 비교할 S의 원소가 없으므로 찾은 위치에 원소 10을 삽입. S={10, 69}, U={30, 2, 16, 8, 31, 22}

  33. 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}

  34. 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}

  35. 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}

  36. 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}

  37. 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}

  38. 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가 공집합이 되었으므로 실행을 종료하고 삽입 정렬이 완성된다.

  39. 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)

  40. 6.4 삽입정렬(insertion sort) • 최악의 경우:역순으로 정렬된 상태에서의 삽입 • 최선의 경우:이미 정렬된 상태에서의 삽입

  41. 6.4 삽입정렬(insertion sort) • 실행 결과

  42. 예제 5 부 정렬되지 않은 입력 화일이(17,12,37,54,34,48,21,29)로 8개의 항목이 있다. 이것을 삽입 정렬로 분류하면 다음과 같다.

  43. 선택, 버블, 삽입 • 최악의 효율은 모두 O(N2)으로서 동일 • 버블 정렬과 삽입 정렬는 안정정렬 • 레코드들이 하나하나 순차적으로 이동(Shift)하기 때문에 원래의 순서가 유지 • 선택 정렬은 불안정 정렬 • 스왑(Swap)에 의해 단번에 멀리 떨어진 곳으로 이동

  44. 6.5 기수정렬(Radix Sort) • 기수 = 키의 구성요소. 분해된 문자열, 분해된 문자.

  45. 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) • 작은 단위에서 큰단위로 키를 이동 • 우선정렬은 각 버켓을 정렬할 필요가 없으므로 더 간단하다.

  46. 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

  47. 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

  48. 6.5 기수 정렬(radix sort) (계속) • 알고리즘 분석 • n : 레코드수 • q : 기수의 값(큐의 수) • k : 디지트 수(키의 수) • 메모리 사용 공간 : S = ( n + 1) q • 연산 시간 : O(k(n+q)) • 기억 공간의 낭비는 있지만 자리수 정렬 속도는 빠르다

  49. 6.6 2원 병합 정렬 ⑴ 분할(divide) : 입력 자료를 같은 크기의 부분집합 2개로 분할. ⑵ 정복(conquer) : 부분집합의 원소들을 정렬. 순환호출을 이용하여 다시 분할 정복 기법 적용 ⑶ 결합(combine) : 정렬된 부분집합들을 하나의 집합으로 통합 • 2원 병합 정렬의 진행 순서

  50. 6.6 2원 병합 정렬 • 병합 정렬(mergesort) • 여러 개의 정렬된 자료의 집합을 병합하여 한 개의 정렬된 집합으로 만드는 방법 • 부분집합으로 분할(divide), 각 부분집합에 대해서 정렬 작업을 완성(conquer)정렬된 부분집합들을 다시 결합(combine)분할 정복(divide and conquer) 기법 사용 • 병합 정렬 방법의 종류 • 2-way 병합 : 2개의 정렬된 자료의 집합을 결합 하나의 집합으로 만드는 병합 방법 • n-way 병합 : n개의 정렬된 자료의 집합을 결합하나의 집합으로 만드는 병합 방법

More Related