티스토리 뷰
참고용으로 올린 위 그림은 선택정렬의 알고리즘을 그림으로 표현한것입니다.
이전 포스팅인 삽입정렬에서 설명이 조금 부족했다는 생각에 덧붙이자면, 삽입정렬은 배열 내 "정렬된 부분" 과 "정렬되지 않은 부분"이 있을때 정렬되지 않은 부분에서 가장 작은 숫자를 정렬된 부분에 "삽입"하면서 정렬된부분을 한칸씩 옆으로 밀어 영역을 넓이는 방법이고, 선택정렬은 마찬가지로 정렬되지 않은 부분에서 가장 작은 숫자를 찾지만, 옆으로 한칸씩 밀어 삽입하는 방법이 아닌, 자리를 바꿔서 정령하는 방법입니다. 얼핏 보면 비슷한 알고리즘이지만 삽입정렬은 데이터를 중간에 삽입하는 방법이고 선택정렬은 자리를 바꿔버리는 방법이라는 점에서 그 차이점을 찾을 수 있습니다.
바로 코드를 살펴보도록 하지요. 두개의 함수를 정의하여 사용하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | int findMaxPos(int *p, int size) { int pos = 0; for (int i = 1; i <size; i++) { if (p[pos] < p[i]) pos = i; } return pos; } void selectionSort(int *p) { int temp; int size = ARRAY_SIZE; for (size; size> 1; size--) { temp = findMaxPos(p, size); std::swap(p[temp], p[size - 1]); } } | cs |
배열에서 가장 큰 숫자의 위치를 찾는 findMaxPos와 selectionSort를 정의하였습니다. 한번 살펴보도록 하겠습니다.
셀렉션 소트 함수 중간에 std::swap 이라는 함수를 사용하였는데요. 다음에 std에 관한 포스팅을 하면 자세히 언급하겠습니다만, 이번 포스팅에서는 간단한 설명만 하고 넘어가도록 하겠습니다. 일반적으로 변수 a와 b의 내용을 바꿀때는 아래와 같이 사용하곤 합니다.
1 2 3 4 5 | int a = 10 ,b = 20 ,temp; temp = a; a = b; b = temp; | cs |
1 | std::swap(a,b); | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> #include <stdlib.h> #include <algorithm> #define ARRAY_SIZE 10 int findMaxPos(int *p, int size); void selectionSort(int *p); int main() { int size = ARRAY_SIZE; int arr[10]; for (int i = 0; i < size; i++) arr[i] = rand() % size + 10; selectionSort(arr); for (int i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); return 0; } | cs |
셀렉션 소트에서는 배열을 전달인자로 받고, 임시변수인 temp를 선언, size를 선언합니다. 매크로 상수를 사용했습니다.
핵심이 되는 반복문입니다. findMaxPos 함수를 통해 가장 큰 숫자의 방번호를 찾을 수 있습니다. findMaxPos는 가장 큰 "값"을 찾는것이 아니라 "값의 방 번호"를 찾는 함수입니다. 착오없으시길, 아무튼 찾은 방의 번호를 임시변수인 temp에 저장합니다. 그리고 p[temp]와 p[size-1]을 스왑합니다. 이렇게 하면 배열내에서 가장 큰 숫자가 가장 오른쪽으로 가며, 오른쪽부터 "정렬된 상태"가 됩니다. 반복문이 계속되면서 size를 하나씩 줄여가며 정렬된 부분과 정렬되지 않은 부분을 구분합니다.
처음에 언급했듯이, 삽입정렬과 선택정렬은 얼핏 보면 비슷해보이지만, 삽입정렬은 한칸씩 옆으로 당겨서 자리에 낑겨 들어가는 식이고, 선택정렬은 그냥 값을 바로 스왑해버리는 점이 다른 점입니다.
이 글을 보시는 여러분께 도움이 되셨으면 하고, 잘 이해가 안되거나 설명이 부족한 부분에 대해서 질문 하시면 친절히 답변 드리겠습니다. 지적도 달게 받습니다. 댓글과 추천은 큰 힘이 됩니다. 감사합니다.
'C,C++' 카테고리의 다른 글
자료구조 : 재귀함수(Recursive Function) (0) | 2016.03.28 |
---|---|
자료구조 : 선형검색(Linear Search)와 이진 검색(Binary Search) (11) | 2016.03.17 |
정렬(Sort) : 삽입정렬(Insertion Sort) (5) | 2016.03.11 |
데이터 캡슐화, 하이딩, 은닉기법 (0) | 2016.03.10 |
추상 자료형(ADT)란 무엇인가? (0) | 2016.03.09 |
- Total
- Today
- Yesterday
- 클라이언트
- 디렉터리
- C++
- 액터
- Sort
- 스레드
- 파이썬예제
- 파일
- UML
- 리눅스
- C/C++
- socket
- 악보
- 티그널
- 티라노 시그널
- 소켓
- C
- 터미널
- 쓰레드
- 소켓 프로그래밍
- 프로세스
- 안드로이드
- 데이터베이스
- MFC
- 라즈베리파이
- 파이썬
- 정렬
- 자료구조
- 클래스
- 유즈케이스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |