선택 정렬이란?
선택 정렬(seleciton sort)은 가장 작은 데이터를 찾아 가장 앞의 데이터와 교환해나가는 정렬 방식입니다.
예를 들어 다음과 같이 1부터 10까지의 수를 무작위로 섞어놓은 배열이 있습니다.
값 5 6 10 4 3 8 7 1 2 9
위치 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
5부터 9까지 훑어보면서 가장 작은 값을 찾아야 합니다.
5와 비교할 숫자는 다음에 오는 숫자 6부터 마지막 숫자까지 비교한다.
선택 정렬은 가장 작은 숫자와 가장 작은 숫자의 위치를 기억했다가 마지막 수까지 비교가 끝나면 마지막에 교환을 해줍니다.
이제 위치[0]의 정렬은 끝났습니다. 위 과정을 반복해 주면 됩니다.
#include <stdio.h>
int main(){
//1~10 무작위 배열
int arr[10] = {5, 6, 10, 4, 3, 8, 7, 1, 2, 9};
int i, j, temp, index, min;
for(i=0;i<10;++i){
//가장 작은 수와 가장 작은수 위치
min = arr[i];
index = i;
//비교하여 가장 작은 수와 위치기록
for(j=i+1;j<10;++j){
if(min>arr[j]){
min = arr[j];
index = j;
}
}
//비교가 끝나면 교환
temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
//출력
for(i=0;i<10;++i){
printf("%d ", arr[i]);
}
return 0;
}
결과값:
1 2 3 4 5 6 7 8 9 10
이렇게 선택 정렬을 통해 오름차순으로 정렬된 것을 확인할 수 있습니다.
내림차순으로 구현하려면 어떻게 해야 할까요?
비교할 때 min> arr [j]의 부호를 반대로 min <arr [j]로 해주면 내림차순으로 정렬됩니다.
선택 정렬의 시간 복잡도(or 빅오)는 O(N^2)입니다.
'알고리즘' 카테고리의 다른 글
[C/C++] 삽입 정렬(insertion sort) (0) | 2020.01.09 |
---|---|
[C/C++] 선택 정렬같은 버블 정렬 구현(선택정렬 + 버블정렬) (0) | 2020.01.08 |
[C/C++] 코드업(codeup) 4564번 계단 오르기 (1) | 2020.01.06 |
[C/C++] 코드업(codeup) 3733번 우박수 길이 (3n+1) (large) (0) | 2020.01.05 |
[C/C++] 코드업(codeup) 3704번 계단 오르기 2 (0) | 2020.01.04 |