Select sort는 개념이 무척 간단하다.
오름차순의 경우 각 step마다 가장 큰 값을 찾아 제일 끝 요소와 자리를 바꾼다.
내림차순의 경우 각 step마다 가장 큰 값을 찾아 제일 첫 요소와 자리를 바꾸면 된다.
그림으로 설명하자면 아래와 같다.
STEP 1) 모든 요소를 검사하여 가장 큰 값을 array[max-1]에 저장한다.
STEP 2) max-1 요소 전까지 검사하여 가장 큰 값을 array[max-2]에 저장한다.
STEP 3) max-2 요소 전까지 검사하여 가장 큰 값을 array[max-3]에 저장한다.
선택 정렬의 경우 시간 복잡도는 O(n^2)이며, 알고리즘이 매우 단순하다.
또한 메모리 이동이 적을 수 있어서 메모리가 제한적인 환경에서 사용하면 성능 상 유리하다.
코드는 아래와 같이 구현 가능하다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <stdio.h> #define MAX_NUM (10) #define SORT_UP (1) #define SORT_DOWN (-1) typedef struct _score { int id; char name[10]; }SCORE; void print_data(SCORE *d); void sort_select(SCORE *d, int order); int main(void) { SCORE list[MAX_NUM] = { { 2, "kim" },{ 5, "lee" },{ 1, "park" },{ 7, "kang" },{ 4, "jung" }, { 10, "su" },{ 9, "won" },{ 6, "ring" },{ 3, "son" },{ 8, "feng" } }; printf("UP sort\n"); sort_select(list, SORT_UP); print_data(list); printf("\nDOWN sort\n"); sort_select(list, SORT_DOWN); print_data(list); return 0; } void sort_select(SCORE *d, int order) { int i, j, k; SCORE temp; for (i = 0; i < MAX_NUM - 1; i++) { for (k = 0, j = 1; j < MAX_NUM - i; j++) { if ((d[k].id - d[j].id) * order < 0) { k = j; } } j--; if (j != k) { temp = d[j]; d[j] = d[k]; d[k] = temp; } } } void print_data(SCORE *d) { int i = 0; for (i = 0; i < MAX_NUM; i++) { printf("ID(%d) NAME(%s)\n", d[i].id, d[i].name); } } | cs |
이전에 포스팅하였던 bubble sort에서 함수 안에 내용만 위에 설명한대로 수정하였다.
오름차순 및 내림차순에 대한 코드를 작성하였으며, id 기준으로 정렬을 수행한다.
코드 실행 결과는 아래와 같다.
역시 오름차순과 내림차순 모두 잘 정렬된 것을 확인할 수 있다.
위보다 더 효율적인 코드도 구현 가능하지만 기본이 되는 코드이기 때문에 참고하면 좋을 것 같다.
'자료구조' 카테고리의 다른 글
[자료구조] Linux Kernel Generic Swap 함수 분석 및 구현 (0) | 2022.02.18 |
---|---|
[자료구조] Bubble sort (버블 정렬) (0) | 2020.02.05 |