예꾸
개발자국
예꾸
전체 방문자
오늘
어제
  • 분류 전체보기 (111)
    • CS (6)
      • 데이터베이스 (5)
      • 운영체제 (0)
      • Computer Architecture (1)
    • 끄적끄적 (4)
    • 이론 (29)
      • 알고리즘 (18)
      • 자료구조 (4)
      • WEB (2)
      • JS (2)
      • Git (2)
      • Python (1)
    • 면접준비 (3)
      • Vue (1)
      • Design Pattern (1)
      • Frontend (1)
    • 개발기술 (20)
      • Git PUSH 자동화 (3)
      • VUE (1)
      • Linux (2)
      • MERN Stack (2)
      • React기반 Gatsby로 블로그 개발하기 (6)
      • Typescript (0)
      • 감정일기장(React) (3)
      • CI CD (3)
    • 코드트리 (6)
      • 블로그 챌린지 (3)
      • 모의시험 (3)
    • 취업준비 (3)
      • 코딩테스트 후기 (3)
    • 프로그래머스 (8)
      • SQL (7)
      • 알고리즘 (1)
    • 백준 (31)
      • 그리디(탐욕법) (6)
      • 구현 (5)
      • 그래프탐색(dfs, bfs) (5)
      • 완전탐색 (5)
      • 문자열 (5)
      • 누적합 (2)
      • DP(다이나믹 프로그래밍) (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 코딩테스트
  • 프로그래머스 SQL
  • 코딩테스트실력진단
  • JS
  • React
  • 코드트리
  • 컴퓨터 시스템의 구조
  • 자료구조
  • 프로그래머스
  • 운영체제
  • 알고리즘
  • 백준 그래프탐색
  • javascript
  • 백준 완전탐색
  • 코드트리 추천
  • 백준 문자열
  • 백준 그리디
  • 백준 구현
  • 나만의공부노트
  • gatsby

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
예꾸

개발자국

[정렬] Selection Sort - JS, Python
이론/알고리즘

[정렬] Selection Sort - JS, Python

2021. 4. 17. 16:43

선택정렬 알고리즘

1. 먼저 주어진 리스트 중에 최소값찾기

2. 그 값(최소값)을 맨 앞에 위치한 값과 교환

3. 맨 앞을 고정하고 다시 순회하며 최소값 찾기

4. 그 값을 고정 값 바로 다음 위치와 교체...반복

 

 

 

 

선택정렬은 n번째 회전이 끝날 때마다 앞에서 n번째 데이터의 위치가 고정된다

교환 횟수를 최소화하는 반면 각 자료 비교하는 횟수 증가

 

Big O

* 선택 정렬은 N번 만큼 가장 작은 수를 찾아서 맨 앞으로 보내줘야 함
* 구현 방식에 따라 사소한 오차는 있을 수 있지만 전체 연산횟수는 아래와 같음
   N + (N - 1) + (N - 2) + ... + 2
* 이는 (N^2 + N - 2) / 2 로 표현할 수 있는데 빅오 표기법에 따라서 O(N^2)이라 작성

 

WORST O(n^2) - 정렬이 하나도 안되어 있는 경우

BEST O(n^2) - 이미 정렬이 되어있는 경우 (비교 횟수)

 

선택정렬은 이미 정렬되어 있는 경우에도 O(n^2)의 시간복잡도를 가진다

이유는 매번 정해진 자리에 올 수 있는 최소값을 찾아야하기 때문 => 성능이 떨어짐

 

장점

in place알고리즘이기 때문에 메모리가 절약된다

직관적이므로 이해하기 쉽고 구현하기 쉽다

 

* in place란?

자료를 정렬할 때 추가적인 메모리 공간이 필요한 것이 아니고 데이터가 저장된 그 공간 내에서 정렬을 한다는 뜻

단점

최선의 경우에도 최악의 경우에도 O(n^2)라는 시간이 걸리는 만큼 성능이 매우 떨어짐

더 많은 비교가 필요하므로 비용이 많이 듦

 

Python 코드

# 선택정렬
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

for i in range(len(array)):
    min_idx = i # 가장 작은 원소의 인덱스
    for j in range(i+1, len(array)):
        if array[min_idx] > array[j]:
            min_idx = j
    array[i], array[min_idx] = array[min_idx], array[i] # 스와프

print(array)

JS 코드

// 선택 정렬
let array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

for (let i = 0; i < array.length-1; i++) {
    let min_idx = i
    for (let j = i+1; j < array.length; j++) {
        if (array[min_idx] > array[j]) {
            min_idx = j
        }
    }
    if (min_idx !== i) {
        let swap = array[min_idx]
        array[min_idx] = array[i]
        array[i] = swap
    }
    console.log(`${i} 회전 : ${array}`)

}
return array;
    '이론/알고리즘' 카테고리의 다른 글
    • [정렬] Quick Sort - JS, Python
    • [정렬] Insertion Sort - JS, Python
    • [JavaScript] 알고리즘에 쓰이는 문법 (판별)
    • [JavaScript] 알고리즘에 쓰이는 문법 (중복, 포함여부)
    예꾸
    예꾸
    비전공자 옒의 개발이야기💻

    티스토리툴바