290 likes | 717 Views
알고리즘 5. 정렬 알고리즘. 임지희 ambomis@kunsan.ac.kr 군산대학교 정보통계학과 정보과학기술 연구실 2011.07.19. 목 차. 선택 정렬 (Selection Sort) 삽입 정렬 (Insertion Sort) 거품 정렬 (Bubble Sort). 선택 정렬 ( 1/8). int 형 배열 정렬 , 정수 배열 int a[] 와 배열 크기 n 을 가진다 . 1. i = 0 2. i 가 n-2 가 되면 끝낸다 . 3. 배열의 i 항부터 n-1 항까지 중
E N D
알고리즘5. 정렬 알고리즘 임지희 ambomis@kunsan.ac.kr 군산대학교 정보통계학과 정보과학기술 연구실 2011.07.19
목 차 • 선택 정렬 (Selection Sort) • 삽입 정렬 (Insertion Sort) • 거품 정렬 (Bubble Sort) IST (Information Sciences & Technology) Laboratory
선택 정렬 (1/8) int형 배열 정렬, 정수 배열 int a[]와 배열 크기 n을 가진다. 1. i = 02. i가 n-2가 되면 끝낸다.3. 배열의 i항부터 n-1항까지 중 최소값을 찾아서 그 항을 min에 저장.4. 배열의 i항과 min항을 교환한다.5.i를 하나 증가시키고 2로 돌아간다.i범위 : 0 ~ n-2 j 범위 : 1 ~ n-1 • 선택정렬 • 제일 작은 값을 선택하여 제일 앞에서 부터 채워 나가는것 • 많은 비교와 적은 교환 • 선택 정렬 알고리즘 • 흰색 - 최소값, 하늘색 - 최대값 IST (Information Sciences & Technology) Laboratory
선택 정렬 (2/8) • 선택 정렬 알고리즘 IST (Information Sciences & Technology) Laboratory
선택 정렬 (3/8) • select_sort() 함수 • 정수형의 배열과 배열 요소의 개수를 인자로 받아 선택정렬 IST (Information Sciences & Technology) Laboratory
선택 정렬 (4/8) • a[i] • i • 선택 정렬의 과정 • 장점 • 선택 정렬의 비교횟수 N2/2 , 교환횟수 최대 N ( 오로지 남은 부분에 대해 최소값만을 찾아서 한번씩만 교환하면 정렬 됨) • 특징 • 배열의 앞부분부터 차례로 정렬 • 정렬을 하지 않은 부분은 변함 없음 • 내부루프 : 최소값을 찾기 위해 min과 a[j] 비교 IST (Information Sciences & Technology) Laboratory
선택 정렬 (5/8) • 안정성 문제 • 안정성 : 키의 상대적 순서가 정렬 후에도 변함 없는 것 • 선택 정렬은 안정성이 없음 Ex] T1 ,T2,T3인 T의 순서가 정렬 후 T3 ,T1 ,T2 로 바뀜 • 선택 정렬과 같이 인접한 배열요소를 교환하지 않고 떨어져 있는 요소를 교환하는 경우에는 안정성이 없는 경우가 많음 IST (Information Sciences & Technology) Laboratory
선택 정렬 (6/8) • 선택 정렬 알고리즘의 실행 시간 분석 • select_sort() 함수를 timer.h를이용하여 시간 측정 • 최악인 경우, 최선인 경우, 평균적인 경우를 찾기 위하여 정렬된배열,난수의배열, 반쯤정렬된배열, 역순의배열로 나누어 시간 측정 • 최악의 경우 : 역순 배열 (N번 교환을 해야 함) • 최선의 경우 : 이미 정렬된 배열 (교환은 없고 비교만 있음) • 결론 1. 선택정렬은 N*(N-1)/2번의 비교를 위해 시간을 다 잡아먹기 때문에 최악의 경우나 최선의 경우나 별 차이가 없음. 차이가 생기는 것은 교환의 횟수일 뿐임. 2. O(N2)의 성능 IST (Information Sciences & Technology) Laboratory
선택 정렬 (7/8) • 일반적인 함수 제작 • 일반형 정렬함수 gen_select_sort()는 정수배열정렬함수 select_sort()에 비하여 매우 느린 속도를 나타냄 • 이유: 복잡한 포인터 연산을 하고, =연산에mency()함수를 호출해야하기 때문 • 하지만 함수의 변경없이 어떤 형의 자료라도 정렬 할 수 있다는 장점이 있다. IST (Information Sciences & Technology) Laboratory
선택 정렬 (8/8) 단점 : select_sort()에 비하여 매우느림 *복잡한 포인터 연산 *함수 호출 장점 : 함수의 변경 없이 어떤 형의 자료라도 정렬 할 수 있음 • 일반적인 함수 제작 IST (Information Sciences & Technology) Laboratory
삽입 정렬 (1/8) 이미 정렬이 된 부분에 새로운 키를 적절한 장소로 삽입하는 동작을 반복적으로 하여 정렬 1. i = 1;2. j = i;3. a[j-1] > a[i] (순서에 맞는 위치까지)이고 j > 0 인 동안3.1 a[j] = a[j-1] --> a[i]를 삽입할 공간을 만든다.3.2 j를 하나 감소한다.4.a[j] = a[i] --> 배열을 옮겨 생긴 빈 공간에 a[i]를 삽입5.i를 하나 증가하고 2로 돌아간다.i범위 : 1 ~ n-1j 범위 : 0 ~ n-2 11 • 삽입정렬 • 이미 정렬된 부분에 새로운 키를 적절한 장소에 삽입하는 동작을 반복 • 삽입정렬의 전략 IST (Information Sciences & Technology) Laboratory
삽입 정렬 (2/8) 안정성이 있음 IST (Information Sciences & Technology) Laboratory
삽입 정렬 (3/8) • C로 구현한 삽입 정렬 • t 사용하는 이유 • 안정성을 결정하는 a[j-1] > t IST (Information Sciences & Technology) Laboratory
삽입 정렬 (4/8) • 삽입 정렬의 분석 • 정렬된 배열 : 매우 빠른 속도( 비교N번, 교환X ) • 난수 배열 : 선택 정렬 보다는 훨씬 효율이 좋음 • 대충 정렬된 배열 : 비교와 교환의 횟수가 작아지므로 빨라짐 • 역순 배열 : 최악의 경우 ( 비교,교환 N*(N-1)/2→ 선택 정렬보다 속도가 느림) 비교 N*(N-1)/2, 교환N • 결론 1.삽입정렬은 입력자료에 굉장히 민감 2.비교 횟수는 적고 교환 횟수가 많아 작은 레코드의 배열에 사용하면 좋음 3. O(N2)의 성능 IST (Information Sciences & Technology) Laboratory
삽입 정렬 (5/8) • 삽입 정렬의 최적화 • 보초(sentinel)를 사용하여 내부 루프 만들기 • 삽입 정렬할 레코드의 키값이 일정한 범위 내에 있을때 사용 고려해봄 Ex] 키 값이 정수값인데 양의 정수만 다룬다면 배열의 첫 요소 a[0]에 -1을집어 넣고 실제 자료들은 a[1] 이후에 저장. → j>0과 같은 비교문을 하나 없앨 수 있음 → a[0]는 경계의 벗어남을 막아줌 • 많은경우에서 키값의 최소값을 정하지 못하기 때문에 사용에 신중해야함 • 보초 기법의 사용시 삽입정렬의 실행 시간이 단축됨( 특히,N이 클 경우) IST (Information Sciences & Technology) Laboratory
삽입 정렬 (6/8) • 간접 정렬( index배열 이용 ) • 실제로 a배열을 정렬 • 간접 정렬 • 고려하는 이유 : 삽입 정렬이 비교 횟수는 적지만 교환 횟수가 많기 때문 • 레코드의 배열은 손대지 않고 따로 만든 인덱스의 배열을 조작하는 방법 • 인덱스배열은 간단한 정수배열일 경우가 많으므로 삽입 정렬을 사용하면 효율적 IST (Information Sciences & Technology) Laboratory
삽입 정렬 (7/8) 간접 정렬 IST (Information Sciences & Technology) Laboratory
삽입 정렬 (8/8) 일반화된 함수 작성 IST (Information Sciences & Technology) Laboratory
거품 정렬 (1/7) SORTI NG → S와O를 비교하고 교환 OSRTING→ S와R를 비교하고 교환 ORSTING→ S와T를 비교 ORSTING→ T와I를 비교하고 교환 ORS ITNG→T와N을 비교하고 교환 ORSINTG→ T와G를 비교하고 교환 O RSINGT→ 최대값 T가 제일 뒤에 옴 거품 정렬 알고리즘 1.i = 0;2.i가 n-1이 되면 끝낸다.3.j = 1;4.j가 n-i가 되면 7로 간다.5. a[j-1] > a[j]이면 두 값을 교환한다.6. j를 하나 증가시키고 4로 돌아간다.7. i를 하나 증가시키고 2로 돌아간다.j가 n-i까지만 반복하는 것은 n-i이후는 이미 최대값들로 정렬된 상태이기 때문이다. • 거품 정렬 • 배열의 인접 요소를 비교, 교환 하는 정렬 • 시간 복잡도가 O(N2)로 정렬알고리즘에서 가장 느림 • 코드가 단순하기 때문에 사용. • 거품정렬의 전략 • 대충 정렬 • 최대값을 배열의 제일 뒤로 보냄 IST (Information Sciences & Technology) Laboratory
거품 정렬 (2/7) • 거품 정렬의 실제 • 인접한 요소의 교환을 통해 대충 정렬을 하면서 최대값을 뒤로 옮기기 때문에 정렬의 전 과정을 하지 않아도 이미 정렬 되어 있는 경우가 많음 • 안정성이 있음 IST (Information Sciences & Technology) Laboratory
거품 정렬 (3/7) 하늘색: 그 단계 최대값 ( 옮겨진 키 ) 안정성이 있음 IST (Information Sciences & Technology) Laboratory
거품 정렬 (4/7) C로구현한 거품 정렬 IST (Information Sciences & Technology) Laboratory
거품 정렬 (5/7) • 거품 정렬의 분석 • 최선의 경우 : 정렬된 배열( N*(N-1)/2번 비교, 교환 없음 ) 선택정렬의 비교문은min>a[j],거품 정렬의 비교문은a[j-1]>a[j]이기 때문에 따라서 이 배열을 참조하는 것보다 일반 변수를 참조 하는 것이 더 효율적임 • 최악의 경우 : 역순 배열( N*(N-1)/2번 비교, N*(N-1)/2번 교환 ) • 결론 1. 최대값을 찾기, 대충 정렬하기 두 가지 일을 하기 때문에 실행 시간이 느림 2. 거품정렬은 모든 경우에 있어 고르게 속도가 느리기 때문에 실제 프로그래밍에서 거품 정렬은 거의 사용이 배제됨 3. O(N2)의 성능 IST (Information Sciences & Technology) Laboratory
거품 정렬 (6/7) [ 개선된 거품정렬의 실행시간 ] 정렬된 배열 : 시간이 거의 걸리지 않음 다른 경우의 배열 : 시간이 더 느려짐 → 몇 가지 문장이 추가됨으로서 얼마나 실행시간에 영향을 주는지 알 수 있음 거품 정렬의 개선 IST (Information Sciences & Technology) Laboratory
거품 정렬 (7/7) 일반화된 함수 작성 IST (Information Sciences & Technology) Laboratory