자료구조론 11장 정렬(sort).

Slides:



Advertisements
Similar presentations
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
Advertisements

알고리즘 기본 개념 정렬 알고리즘 탐색 알고리즘 알고리즘 복잡도.
2.6 탐색(Search) 1. 순차검색 (Sequential Search, Linear Search)
T-tree 엄종진 강원대학교 컴퓨터과학과.
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
연결리스트(linked list).
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
Chapter 04. 자료구조.
자료구조 한빛미디어. 컴퓨터과학개론.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
10장 정렬.
Chapter 10. 정렬 Chapter 10-1: 단순한 정렬 알고리즘.
누구나 즐기는 C언어 콘서트 제8장 배열.
정보보안 프로젝트 (Sort Algorithm) 학 부 : 컴퓨터 정보공학부, 네트워크 정보 공학부
빠른정렬(Quick Sort) – 개요 (1/2)
C언어 응용 제 13 주 그래프2, 정렬.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express Slide 1 (of 32)
제8장 배열 1부 8.1 배열 8.2 배열의 초기화 8.3 배열의 응용 8.4 정렬과 탐색 8.5 다차원 배열.
프로그래밍 랩 – 7주 리스트.
배열(Array) 선린인터넷고등학교 정보통신과 유 순 옥.
탐색 (1) 용어 정리 순차 탐색 (Sequential Search) 리스트 : 하나 이상의 필드로 된 레코드의 집합
CHAP 9: 정렬 (part 2) 순천향대학교 컴퓨터학부 하 상 호.
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 44).
제 8 장 정렬.
Introduction To Data Structures Using C
11 정렬.
프로그래밍 개요
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
CHAP 9: 정렬 순천향대학교 컴퓨터학부 하 상 호.
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
메모리 관리 & 동적 할당.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
8장. 상호 배타적 집합의 처리.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
알고리즘: 우선순위 큐(8장) 순천향대학교 컴퓨터 학부 하 상 호.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
합집합과 교집합이란 무엇인가? 01 합집합 두 집합 A, B에 대하여 A에 속하거나 B에 속하는 모든 원소로 이루어진 집합을 A와 B의 합집합이라고 하며, 기호 A∪B로 나타낸다. A∪B ={x | x∈A 또는 x∈B}
병합 정렬 병합 정렬2 석차구하기 가까운 수 구하기 이진검색
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
객체기반 SW설계 팀활동지 4.
균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 27).
데이터 동적 할당 Collection class.
알고리즘: 우선순위 큐(8장) 순천향대학교 컴퓨터 학부 하 상 호.
단축키 기능 1. 단축키 기능 설명 Alt + R 조회 S 저장 I 삽입 A 추가 D 삭제 P 출력 Q 닫기
자료구조론 12장 검색(search).
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
DA :: 퀵 정렬 Quick Sort 퀵 정렬은 비교방식의 정렬 중 가장 빠른 정렬방법이다.
5장. 선택 알고리즘.
빠른정렬(Quick Sort) – 개요 (1/2)
7주차: Functions and Arrays
3. 반/전 가산기, 반/전 감산기 제작 컴퓨터 구조 실습 안내서.
쉽게 배우는 알고리즘 2장. 점화식과 점근적 복잡도 분석
Chapter 10 데이터 검색1.
CHAP 9: 정렬 순천향대학교 컴퓨터학부 하 상 호.
11장 배열 1. 배열이란? 1.1 배열의 개요 1.2 배열의 선언과 사용.
7장 연습 문제 풀이 학번 : 이름 :조 재한.
통계학 R을 이용한 분석 제 2 장 자료의 정리.
트리 (Logical) Data Structures Linear list Tree Graph Linear structures
제 4 장 Record.
수치해석 ch3 환경공학과 김지숙.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
우선순위 큐 & Heap Ref. C로 쉽게 풀어쓴 자료구조, 생능출판사, 2005.
빠른정렬(Quick Sort) – 개요 (1/2)
Docker Study 6~7.
(Permutations and Combinations)
C++ Espresso 제15장 STL 알고리즘.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

자료구조론 11장 정렬(sort)

이 장에서 다룰 내용 정렬 선택 정렬 버블 정렬 삽입 정렬 퀵 정렬 병합 정렬 기수 정렬 힙 정렬

정렬 정렬(sort) 순서 없이 배열된 자료들을 어떤 기준에 따라 오름차순(ascending order)으로 또는 내림차순(descending order)으로 재배열하는 것 자료를 정렬하는 데 기준이 되는 특정 값을 키(key)라고 함 정렬의 예 컴퓨터 아이콘들을 이름 순으로 정렬 학생들의 정보를 성적 순으로 내림차순 정렬 학생들의 정보를 학년-이름을 기준으로 오름차순 정렬 안정 정렬(stable sort)이 필요한 경우도 있음 접수번호 학년 이름 성적 접수번호 학년 이름 성적 1 2 이 60 3 1 박 80 2 3 김 90 4 2 김 70 3 1 박 80 1 2 이 60 4 2 김 70 5 2 최 80 5 2 최 80 2 3 김 90

정렬 정렬의 분류 내부 정렬(internal sort) 정렬할 자료를 메인 메모리에 올려서 정렬하는 방식 정렬 속도가 빠르지만 정렬할 수 있는 자료의 양이 메인 메모리의 용량에 따라 제한됨 효율성 기준 : 비교 횟수, 자료 이동 횟수, 추가 기억장소 필요량 외부 정렬(external sort) 정렬할 자료를 보조 기억장치에 두고 정렬하는 방식 내부 정렬보다 속도는 떨어지지만 내부 정렬로 처리할 수 없는 대용량 자료에 대한 정렬 가능 효율성 기준 : 보조 기억장치로의 입력과 출력 최소화

정렬 내부 정렬 방식 기본 정렬 : 알고리즘은 단순, 평균 시간 복잡도 O(n2), 정렬할 원소 갯 수가 작을 때 유용 선택 정렬(selection sort) 버블 정렬(bubble sort) 삽입 정렬(insertion sort) 고급 정렬 : 평균 시간 복잡도 O(n log n) 퀵 정렬(quick sort) 병합 정렬(merge sort) 힙 정렬(heap sort) 원소끼리의 비교에 기반하지 않은 특수 정렬 기수 정렬(radix sort) - 버킷 정렬(bucket sort) 계수 정렬(counting sort)

정렬 외부 정렬 방식 병합 방식 : 파일을 부분 파일로 분리하여 각각을 내부 정렬 방법으로 정렬하여 병합하는 정렬 방식 병합 방식 : 파일을 부분 파일로 분리하여 각각을 내부 정렬 방법으로 정렬하여 병합하는 정렬 방식 2-way 병합 k-way 병합 ...

선택 정렬 선택 정렬(selection sort) 전체 원소들 중에서 기준 위치에 맞는 원소를 선택하여 그 기준 위 치에 저장하는 방식으로 정렬한다. 수행 방법 전체 원소 중에서 가장 작은 원소를 찾아서 선택하여 첫 번째 원 소와 자리를 교환한다. 두 번째로 작은 원소를 찾아 선택하여 두 번째 원소와 자리를 교 환한다. 세 번째로 작은 원소를 찾아서 세 번째 원소와 자리를 교환한다. 이 과정을 반복하면서 정렬을 완성한다.

선택 정렬 선택 정렬 수행 과정 69, 10, 30, 2, 16, 8, 31, 22 ① 첫 번째 자리를 기준 위치로 정하고, 전체 원소 중에서 가장 작 은 원소 2를 선택하여 기준 위치에 있는 원소와 자리 교환

선택 정렬 ② 두 번째 자리를 기준 위치로 정하고, 나머지 원소 중에서 가장 작은 원소 8을 선택하여 기준 위치에 있는 원소와 자리 교환 이 과정을 반복 ...

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

선택 정렬 선택 정렬 알고리즘 선택 정렬 알고리즘 분석 추가 기억장소 필요량 : O(1) 연산 시간 1단계 : n-1개의 원소 비교 2단계 : n-2개의 원소 비교 3단계 : n-3개의 원소 비교  시간 복잡도 O(n2) selectionSort(a[],n) // a[0..n-1] 을 정렬 for (i←0; i<n-1; i←i+1) { a[i..n-1] 중에서 가장 작은 원소 a[k]를 선택하여, a[i]와 교환한다; } end selectionSort() [알고리즘 11-1]

선택 정렬 선택 정렬 프로그램 public class Sort { public static void selectionSort(int [] a) { int min; for(int i=0; i<a.length-1; i++){ // a[i], a[i+1], ... 중에서 최소값의 인덱스 min을 찾음 min = i; for(int j=i+1; j<a.length; j++){ if(a[j] < a[min]) min = j; } // 기준 원소 a[i]와 최소 원소 a[min]의 자리를 교환 swap(a, min, i); public static void swap(int [] a, int i, int j) { // a[i]와 a[j]를 교환 int temp = a[i]; a[i] = a[j]; a[j] = temp;

선택 정렬 public class Main { public static void main(String [] args) { int [] a = {69, 10, 30, 2, 16, 8, 31, 22}; System.out.print("정렬 전 : "); for(int i=0; i<a.length; i++) System.out.print(a[i] + " "); System.out.println(); Sort.selectionSort(a); System.out.print("정렬 후 : "); }

버블 정렬 버블 정렬(bubble sort) 인접한 두 개의 원소를 비교하여 정렬 기준에 맞지 않으면 자리를 교 환하는 방식으로 정렬한다. 수행 방법 첫 번째 원소부터 마지막 원소까지 비교-교환 작업을 반복하면 가장 큰 원소가 마지막 위치에 놓인다. 가장 큰 원소를 제외하고, 나머지 원소들에 대해 위의 작업을 반 복하면 두번째 큰 원소가 뒤에서 두번째 위치에 놓인다. 가장 큰 원소 두개를 제외하고 위의 작업을 반복하면 세번째 큰 원소가 뒤에서 세번째 위치에 놓인다. 이 과정을 반복하면서 정렬을 완성한다.

버블 정렬 버블 정렬 수행 과정 69, 10, 30, 2, 16, 8, 31, 22 ① 단계 1: 인접한 두 원소를 비교하여 자리를 교환하는 작업을 첫 번째 원소부터 마 지막 원소까지 차례로 반복 하여 69를 가장 뒤로 보냄

버블 정렬 ② 단계 2: 다음 단계를 수행 하여 나머지 원소 중에서 가장 큰 원소 31을 끝에서 두 번째 자리로 보냄 ② 단계 2: 다음 단계를 수행 하여 나머지 원소 중에서 가장 큰 원소 31을 끝에서 두 번째 자리로 보냄 이 과정을 반복...

버블 정렬 ⑦ 단계 7: 8을 끝에서 일곱 번째 자리로 보냄 마지막에 남은 첫 번째 원소는 전체 원소 중에서 가장 작은 원소 로 이미 정렬된 상태이므로 정렬 완성

버블 정렬 버블 정렬 알고리즘 bubbleSort(a[],n) // a[0..n-1] 을 정렬 for (i←n-1; i>0; i←i-1) { for (j←0; j<i; j←j+1) { if (a[j]>a[j+1]) then { a[j]와 a[j+1]을 교환; } end bubbleSort() [알고리즘 11-2]

버블 정렬 버블 정렬 알고리즘 분석 추가 기억장소 필요량 : O(1) 연산 시간 최선의 경우 : 자료가 이미 정렬되어있는 경우 비교횟수 : i번째 원소를 (n-i)번 비교하므로, n(n-1)/2 번 자리교환횟수 : 자리교환이 발생하지 않는다. 최악의 경우 : 자료가 역순으로 정렬되어있는 경우 자리교환횟수 : i번째 원소를 (n-i)번 교환하므로, n(n-1)/2 번  평균 시간 복잡도 : O(n2)

삽입 정렬 삽입 정렬(insert sort) 이미 정렬되어있는 부분에 새로운 원소의 위치를 찾아 삽입하는 방 식으로 정렬한다. 수행 방법 원소들을 두 개의 부분 S와 U로 나누어 생각하자. S : 이미 정렬된 앞부분의 원소들 U : 아직 정렬되지 않은 나머지 원소들 U의 원소를 하나씩 꺼내서 S의 마지막 원소부터 비교하면서 위 치를 찾아 삽입한다. U가 공집합이 되면 삽입 정렬이 완성된다.

삽입 정렬 삽입 정렬 수행 과정 69, 10, 30, 2, 16, 8, 31, 22 초기 상태 첫 번째 원소는 정렬되어있는 S 나머지 원소들은 정렬되지 않은 U ① U의 첫 번째 원소 10을 S의 마지막 원소 69와 비교하여 (10 < 69) 이므로 원소 10은 원소 69의 앞자리가 된다. 더 이상 비교할 S의 원소가 없으므로 찾은 위치에 원소 10을 삽입한다.

삽입 정렬 ② U의 첫 번째 원소 30을 S의 마지막 원소 69와 비교하여 (30 < 69) 이므로 원소 69의 앞자리 원소 10과 비교한다. (30 > 10) 이 므로 원소 10과 69 사이에 삽입한다. 

삽입 정렬 ③ U의 첫 번째 원소 2를 S의 마지막 원소 69와 비교하여 (2 < 69) 이므로 원소 69의 앞자리 원소 30과 비교하고, (2 < 30) 이므로 다시 그 앞자리 원소 10과 비교하는데,  (2 < 10) 이면서 더 이상 비교할 S의 원소가 없으므로 원소 10의 앞에 삽입한다.  이 과정을 반복...

삽입 정렬 ⑦ U의 첫 번째 원소 22를 S의 원소들과 비교하여 16과 30 사이에 삽입한다.

삽입 정렬 삽입 정렬 알고리즘 - 프로그램 public class Sort { public static void insertionSort(int a[]) { // a[0..length-1]을 정렬 int i, j, item; for(i=1; i<a.length; i++) { item = a[i]; // item이 삽입될 위치 j를 찾음 for(j = i; (j>0) && (a[j-1]>item); j--) { a[j] = a[j-1]; } a[j] = item;

삽입 정렬 삽입 정렬 알고리즘 분석 추가 기억장소 필요량 : O(1) 연산 시간 최선의 경우 : 원소들이 이미 정렬되어있어 비교횟수가 최소 바로 앞자리 원소와 한번만 비교하므로 전체 비교횟수 = n-1 시간 복잡도 : O(n) 최악의 경우 : 모든 원소가 역순으로 되어있어서 비교횟수가 최대 전체 비교횟수 = 1+2+3+ ⋯ +(n-1) = n(n-1)/2 시간 복잡도 : O(n2) 삽입 정렬의 평균 비교횟수 = n(n-1)/4  평균 시간 복잡도 : O(n2)

삽입 정렬 최선의 경우: 입력 데이터가 이미 정렬되어 있음 최악의 경우: 입력 데이터가 역순으로 정렬되어 있음

퀵 정렬 퀵 정렬(quick sort) 기준 값을 중심으로 왼쪽 부분과 오른쪽 부분으로 분할한 후, 이 두 부분을 따로 정렬하여 모으는 방식으로 정렬한다. 분할 과정에서 왼쪽 부분에는 기준 값보다 작은 원소들을 이동시 키고, 오른쪽 부분에는 기준 값보다 큰 원소들을 이동시킨다. 기준 값 : 피봇(pivot) 기준 값을 정하는 방법은 다양하나, 전체 원소 중에서 가운데에 위치한 원소를 선택하기도 함 분할-정복(divide-and-conquer) 기법의 알고리즘임 divide conquer combine

퀵 정렬 퀵 정렬 알고리즘 quickSort(a[], begin, end) // a[begin..end] 를 정렬 if (begin < end) then { p ← partition(a, begin, end); // a[begin.. end]를 a[begin..p-1], a[p+1..end] // 로 분할하고, 기준값은 a[p]에 저장 quickSort(a, begin, p-1); // 왼쪽 분할을 정렬함 quickSort(a, p+1, end); // 오른쪽 분할을 정렬함 } end quickSort()

퀵 정렬 퀵 정렬 알고리즘의 partition 알고리즘 partition(a[], begin, end) // a[begin..end]를 분할한 후, 기준값 위치를 리턴 pivot ← A[begin]; i ← begin – 1; j ← end + 1; while(true) do { do repeat j--; until (A[j] ≤ pivot); do repeat i++; until (A[i] ≥ pivot); if(i<j) then then swap(A[i], A[j]); else return j; } end partition()

퀵 정렬 퀵 정렬 알고리즘 분석 추가 기억장소 필요량 : O(1) 연산 시간 최선의 경우 피봇에 의해서 원소들이 왼쪽 부분 집합과 오른쪽 부분 집합 으로 정확히 n/2개씩 이등분이 되는 경우가 반복되어 수행 단계 수가 최소가 되는 경우 최악의 경우 피봇에 의해 원소들을 분할하였을 때 0개와 n-1개로 한쪽으 로 치우쳐 분할되는 경우가 반복되어 수행 단계 수가 최대가 되는 경우  평균 시간 복잡도 : O(n log2n) 같은 시간 복잡도를 가지는 다른 정렬 방법에 비해서 자리 교 환 횟수를 줄임으로써 더 빨리 실행되어 실행 시간 성능이 좋 은 정렬 방법

병합 정렬 병합 정렬(merge sort) 정렬된 자료 집합들을 하나로 병합하는 방식으로 정렬한다. 분할-정복(divide-and-conquer) 기법의 알고리즘임 divide : 주어진 입력 원소들을 같은 크기의 2개의 부분으로 분할 conquer : 각 부분을 따로 정렬 combine : 정렬된 2개의 부분들을 하나로 병합 병합 정렬 방법의 종류 2-way 병합 : 위와 같이 2개의 정렬된 자료의 집합을 병합 k-way 병합 : k 개의 정렬된 자료의 집합을 병합

병합 정렬 병합 정렬 수행 과정 69, 10, 30, 2, 16, 8, 31, 22 ① 분할 단계 : 정렬할 전체 자료의 집합에 대해서 분할작업을 반복 하여 1개의 원소를 가진 부분집합 8개를 만든다.

병합 정렬 ② 병합단계 : 정렬된 2개의 부분을 하나로 병합한다. 모든 원소가 병합될 때까지 계속한다.  정렬 완료

병합 정렬 병합 정렬 알고리즘 mergeSort(a[], m, n) // a[m..n]을 정렬 if (m < n) then { middle ← (m+n)/2; mergeSort(a, m, middle); mergeSort(a, middle+1, n); merge(a, m, middle, n); // a[m..middle]과 a[middle+1..n]을 병합 } end mergeSort() [알고리즘 11-7]

병합 정렬 병합 정렬 알고리즘 분석 추가 기억장소 필요량 : O(n) 각 단계에서 새로 병합하여 만든 부분집합을 저장할 공간이 추가 로 필요 연산 시간 분할 : n개의 원소를 분할하기 위해서 log2n번의 단계 수행 병합 : 각 단계마다 최대 n번의 비교연산 수행  시간 복잡도 : O(n log2n)

기수 정렬 기수 정렬(radix sort) 원소의 키값을 나타내는 기수를 이용한 정렬 방법 정렬할 원소의 키 값에 해당하는 버킷(bucket)에 원소를 분배하였다 가 버킷의 순서대로 원소를 꺼내는 작업을 반복하면서 정렬한다. 이런 종류의 기수 정렬을 버킷 정렬(bucket sort)이라고도 함 기수 만큼의 버킷 필요 : 기수가 10이면 10개의 버킷을 사용 키값의 자리수만큼 단계를 반복 키 값의 일의 자리에 대해서 기수 정렬을 수행하고, 다음 단계에서는 키 값의 십의 자리에 대해서, 그 다음 단계에서는 백의 자리에 대해서 기수 정렬 수행, ... 한 단계가 끝날 때마다 버킷에 분배된 원소들을 버킷의 순서대로 꺼내서 다음 단계의 기수 정렬을 수행해야 하므로 큐를 사용하여 버킷을 만든다.

기수 정렬 기수 정렬 수행 과정 69, 10, 30, 2, 16, 8, 31, 22 키 값이 두 자리 십진수  버킷 10개, 정렬 2단계 수행

기수 정렬 ① 각 원소를 일의 자리 값에 따라서 순서대로 버킷에 분배

기수 정렬 버킷에 분배된 원소들을 순서대로 꺼내서 저장하기

기수 정렬 ② 각 원소를 십의 자리 값에 따라서 순서대로 버킷에 분배

기수 정렬 버킷에 분배된 원소들을 순서대로 꺼내서 저장하기

기수 정렬 버킷 정렬 알고리즘 분석 추가 기억장소 필요량 : 기수 r에 따른 버킷 공간 연산 시간 정렬할 원소의 수(n), 키 값의 자릿수(d), 버킷의 수를 결정하는 기수(r)에 따라서 달라진다. 정렬할 원소 n개를 r개의 버킷에 분배하는 작업 : (n+r) 이 작업을 자릿수 d 만큼 반복  시간 복잡도 : O(d(n+r))

힙 정렬 힙 정렬(heap sort) 힙 자료구조를 이용한 정렬 방법 최대 힙에서는 항상 최대 원소가 루트 노드임 삭제 연산을 수행하면 항상 최대 원소를 삭제하여 리턴 따라서 최대 힙에 대해 원소의 개수만큼 삭제 연산을 수행하면 정렬이 이루어진다. 힙 정렬 수행 방법 정렬할 원소들을 최대 힙으로 구성한다. 힙에 대해 삭제 연산을 수행하여 얻은 원소를 마지막 자리에 배 치한다. 나머지 원소에 대해 다시 최대 힙으로 재구성한다. 위의 작업을 힙 원소가 모두 삭제될 때까지 반복하여 수행한다.

힙 정렬 힙 정렬 수행 과정 69, 10, 30, 2, 16, 8, 31, 22 초기 상태 : 정렬할 원소가 8개이므로 노드가 8개인 완전 이진 트리 를 배열로 구현한 것으로 간주하면 된다. 완전 이진 트리를 최대 힙으로 구성한다.

힙 정렬 ① 힙에 삭제 연산을 수행하여 루트 노드의 원소 69를 구해서 배열 의 마지막 자리에 저장, 나머지 원소들에 대해서 최대 힙으로 재 구성

힙 정렬 ② 힙에 삭제 연산을 수행하여 루트 노드의 원소 31을 구해서 배열 의 비어있는 마지막 자리에 저장, 나머지 힙을 최대 힙으로 재구 성 이 과정을 반복...

힙 정렬 ⑦ 힙에 삭제 연산을 수행하여 루트 노드의 원소 8을 구해서 배열 의 비어있는 마지막 자리에 저장, 나머지 원소들에 대해서 최대 힙으로 재구성

힙 정렬 ⑧ 힙에 삭제 연산을 수행하여 루트 노드의 원소 2를 구해서 배열 의 비어있는 마지막 자리에 저장, 나머지 힙을 최대 힙으로 재구 성하는데 공백 힙이 되었으므로 힙 정렬 종료

힙 정렬 힙 정렬 알고리즘 분석 추가 기억장소 필요량 : O(1) 연산 시간 n개의 노드에 대해서 완전 이진 트리는 log2(n+1) 개의 레벨을 가지므로 힙 구성 시간 : O(nlog2n) 하나의 노드에 대한 힙 재구성 연산 시간 : O(log2n) n개의 노드에 대한 힙 재구성 시간 : O(nlog2n)  시간 복잡도 : O(n log2n)