일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- gan
- Python
- C++
- 스택
- 회귀
- 정렬
- instaloader
- SQL
- 데이터베이스
- 머신 러닝
- googleapiclient
- Seq2Seq
- db
- LSTM
- PANDAS
- 국민대학교
- Heap
- programmers
- 국민대
- python3
- 재귀
- 운영체제
- kmu
- OS
- Stack
- Regression
- 프로그래머스
- machine learning
- 파이썬
- GIT
Archives
- Today
- Total
정리 노트
선택 정렬(Selection Sort) 본문
728x90
선택 정렬(Selection Sort)
선택 정렬은 원소들 중 가장 작은(큰) 값을 정렬되지 않은 부분의 가장 왼쪽(오른쪽)과 swap 하는 정렬 알고리즘입니다.
과정
길이가 6인 정렬되지 않은 정수형 배열({1, 2, 4, 6, 3, 5})를 정렬한다고 해봅시다.
1과 2는 이미 작은 순으로 정렬되어있으므로 여기에 대해서는 swap이 일어나지 않습니다.
다음에는 정렬되지 않은 부분에서 가장 작은 값은 3입니다. 3을 제 위치에 놓기 위해 4와 자리를 swap 합니다.
나머지 4, 5 원소도 위와 같은 단계를 거쳐 배열 정렬을 마무리합니다.
선택 정렬 코드(C++)
#include <iostream>
using namespace std;
void selectionSort(int[], int);
int main()
{
int myArray[6] = {1, 2, 4, 6, 3, 5};
selectionSort(copiedArray, size);
return 0;
}
void selectionSort(int arr[], int n)
{
for (int i = 0; i < n - 1; i++)
{
int minVal = arr[i];
int minIdx = i;
for (int j = i + 1; j < n; j++)
{
if (minVal > arr[j])
{
minVal = arr[j];
minIdx = j;
}
}
if (minIdx != i)
{
swap(arr[i], arr[minIdx]);
}
}
}
(2022.10.11.화요일에 수정)선택 정렬을 하는 동안 진행된 비교 연산 횟수는 최대 n(n - 1) / 2회이므로 최악의 경우 O(n**2) 만큼 걸리고 만약 이미 정렬된 배열이 온다고 해도 비교는 똑같이 진행되므로 best case에서도 O(n**2)으로 해결됩니다.
선택 정렬에서 i, j, minVal, minIdx, swap에 사용될 temp 등의 몇 개의 변수만 사용되므로 공간 복잡도는 O(1)이라 할 수 있습니다. 배열 내에서 정렬되므로 In-place 알고리즘이고 정렬 간 같은 원소들의 위치는 바뀔 수 있으므로 Non-stable sorting 알고리즘입니다.
728x90
'개념 정리 > 알고리즘' 카테고리의 다른 글
Shell Sort (0) | 2022.09.13 |
---|---|
삽입 정렬(Insertion Sort) (0) | 2022.09.12 |
Comb Sort (0) | 2022.09.07 |
칵테일 쉐이커 정렬(Cocktail Shaker Sort) (0) | 2022.09.06 |
버블 정렬(Bubble sort) (0) | 2022.09.05 |