선택 정렬 (Selection Sort)

2023. 4. 27. 00:00·알고리즘 (with JAVA)/기본 알고리즘

1. 개념 설명

(1) 선택 정렬은 배열의 인덱스 위치를 정한 후, 가장 작은 원소를 넣으며 순차적으로 정렬하는 알고리즘이다.

 

 

 

 

2. 과정

by Gfycat

- 실제로 수행되는 과정이며, 맨 앞 인덱스부터 위치를 정한 후, 가장 작은 원소를 찾아서 넣는다.

 

by wiki

 

 

 

 

3. 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class SelectionSort{
    public static void main(String[] args) {
        int[] A = { 7, 2, 8, 10, 1 };
        
        for(int i=0; i<A.length-1;  i++) {
            int index = i;
            
            for(int j=i+1; j<A.length; j++) {
                if(A[j]<A[index]) {
                    index = j;
                }
            }
            //swap
            int tmp = A[i];
            A[i] = A[index];
            A[index] = tmp;
        }
        
        System.out.println(Arrays.toString(A));
    }
}
Colored by Color Scripter
cs

 

 

 

 

4. 시간 복잡도

(1) 수행 횟수를 보면 (n-1) + (n-2) + ... + 2 + 1 --> n(n-1)/2가 나오게 된다.

 

(2) 그러므로, 선택 정렬에 시간 복잡도는 O(n²)이다.

( 시간 복잡도가 상당히 느리지만, 코드가 단순하므로 자주 사용된다고 한다. )

 

 

 

 

5. 공간 복잡도

(1) 주어진 배열 안에서 정렬이 일어나므로, 공간 복잡도는 O(n)이다.

 

 

 

 

6. 장점

(1) 버블 정렬과 같이 코드가 매우 단순하며 직관적이다.

 

(2) 정렬을 위한 비교 횟수는 많지만, 버블 정렬보다는 적기 때문에, 교환이 많이 일어나야 하는 자료 상태에서

비교적 효율적이다.

 

(3) 주어진 배열 안에서 정렬되기 때문에 다른 메모리 공간이 필요하지 않다.

( 제자리 정렬 (in-place sorting) )

 

 

 

 

7. 단점

(1) 시간 복잡도가 최선, 평균, 최악 모두 O(n²)이므로, 시간이 오래 걸리기 때문에 굉장히 비효율적이다.

 

(2) 불안정 정렬이다.

저작자표시 (새창열림)

'알고리즘 (with JAVA) > 기본 알고리즘' 카테고리의 다른 글

삽입 정렬 (Insertion Sort)  (0) 2023.04.27
병합 정렬 (Merge Sort)  (0) 2023.04.27
퀵 정렬 (Quick Sort)  (0) 2023.04.27
거품 정렬 (Bubble Sort)  (0) 2023.04.27
안정 정렬과 불안정 정렬  (0) 2023.04.27
'알고리즘 (with JAVA)/기본 알고리즘' 카테고리의 다른 글
  • 삽입 정렬 (Insertion Sort)
  • 병합 정렬 (Merge Sort)
  • 퀵 정렬 (Quick Sort)
  • 거품 정렬 (Bubble Sort)
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      안정 정렬
      불안정 정렬
      자바 개념
      스트림
      java.lang패키지
      역직렬화
      InputStream
      Collections Framework
      중간연산
      알고스팟
      다형성
      람다식
      안드로이드 스튜디오
      유용한 클래스
      TCP 소켓 프로그래밍
      java.time 패키지
      코딩테스트
      코드트리
      outputstream
      file
      소켓 프로그래밍
      serializable
      제자리 정렬
      Arrays
      코딩트리조별과제
      문자 기반 스트림
      선택 정렬
      map()
      ServerSocket
      snail
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    선택 정렬 (Selection Sort)
    상단으로

    티스토리툴바