Algorithm/정렬 알고리즘

선택 정렬 (Selection Sort)

너지살 2023. 12. 27. 22:35

정렬 알고리즘

 

선택 정렬 (Selection Sort) 

기초적인 정렬 방법 중 하나입니다. 

배열에서 가장 작은 값을 찾아서 맨 앞에 숫자와 교환합니다. 이 작업을 반복하여 앞에서부터 작은 값을 채워 정렬을 완성합니다. 가장 작은 값을 선택해서 선택 정렬 입니다. 

시간 복잡도는 O(N^2) 입니다. 버블 정렬 보단 빠르고 삽입 정렬 보단 느립니다.

 

평균적인 정렬 속도 : 버블 < 선택 < 삽입 

 

선택 정렬은 이해하기 쉽고 구현하기 간단하지만 효율성은 낮은 편입니다. 각 요소를 나머지 모든 요소와 비교해야 하기 때문입니다. 대규모 데이터셋에는 효과적이지 않고 작은 데이터셋에서 사용합니다. 

 

 

동작 과정

시간 복잡도 : O(n^2)

 

1. 최소값 탐색 : 주어진 배열에서 최소값을 찾습니다. 

2. 최소값과 교환: 배열의 첫 번째 위치에 있는 값과 최소값을 교환합니다. 이로써 첫 번째 배열의 요소가 정렬됩니다.

3. 반복 : 배열의 두 번째 요소부터 마지막 요소까지 같은 과정을 반복합니다. 

 

 

예시

초기 배열

int[] array = {3,1,4,2,6,5}; 

3 1 4 2 6 5

 

 

1부터 5까지 중 최소값을 구한다. 최소값은 인덱스 1에 위치한 1이다. 

이 최소값과 0의 위치를 교환한다. 

1 3 4 2 6 5

 

 

2부터 5까지 최소값을 구한다. 최소값은 인덱스 3에 위치한 2이다.

이 최소값과 1의 위치를 교환한다.

1 2 4 3 6 5

 

 

이런 식으로 나머지 부분들을 진행하여 정렬을 완성한다. 

1 2 3 4 5 6

 

 

 

 

Java 코드 구현

/*
선택 정렬(Selection Sort)
시간 복잡도 : O(n^2)
가장 작은 값을 찾은 다음 첫 번째 인덱스에 넣는다.
이 과정을 처음부터 끝까지 반복하여 정렬을 완성한다.
 */
public class SelectionSort {

  public static void main(String[] args) {
    int[] array = {3,1,5,9,4,8,7};
    printArray(array);
    selectionSort(array);
    printArray(array);
  }

  // 선택 정렬 시작
  public static void selectionSort(int[] array) {
    selectionSort(array, 0);
  }

  // 선택 정렬 로직 수행
  public static void selectionSort(int[] array, int start) {
    if(start < array.length-1) {

      // 작은 인덱스 탐색
      int min_index = start;
      for(int i = start; i < array.length; i++) {
        if(array[i] < array[min_index]) min_index = i;
      }

      // 탐색한 작은 인덱스를 맨 앞에 인덱스랑 교환
      swap(array, start, min_index);

      // 다음 인덱스의 값 탐색
      selectionSort(array, start + 1);
    }
  }

  public static void swap(int[] array, int index1, int index2) {
    int temp = array[index1];
    array[index1] = array[index2];
    array[index2] = temp;
  }

  public static void printArray(int[] array) {
    for(int number : array) {
      System.out.print(number + " ");
    }
    System.out.println();
  }

}

 

 

 

마무리

다음에는 삽입 정렬에 대해 정리하겠습니다.

 

 

 

참고 사이트

버블 정렬, 선택 정렬, 삽입 정렬

https://www.youtube.com/watch?v=Bor_CRWEIXo&t=1s

 

선택 정렬 자바로 구현

https://www.youtube.com/watch?v=uCUu3fF5Dws&t=1s