알고리즘/이론공부

정렬 - 선택 정렬(Selection sort)

멍멍댕댕구 2024. 11. 7. 16:20

버블 정렬과 함께 기본적인 정렬에 속하는 정렬 알고리즘은 하나가 더 있습니다. 바로 선택 정렬인데요, 버블 정렬과 비슷하지만 약간 다른 방식의 알고리즘입니다. 오늘은 선택 정렬(Selection sort)에 대해 알아보도록 하겠습니다.

 

📍 선택 정렬(Selection sort)

선택 정렬은 전체 값 중 가장 작은 값을 찾아 제일 앞에 두고, 첫번째 값을 제외하고 제일 작은 값을 찾아 두번째에, 두 번째까지의 값을 제외하고 가장 작은 값을 찾아 세번째에 배치하는 식의 연산을 통해 정렬하는 방식입니다.

자바스크립트로 구현하면 다음과 같습니다.

//숫자로 이루어진 배열 arr가 있다고 가정

for (let i = 0; i < n - 1; i++) {
  let min = i;
  for (let j = i + 1; j < n; j++) {
    //i 다음것이랑부터 비교
    if (arr[j] < arr[min]) {
      //숫자로 만들어 비교
      min = j;
    }
  }
  let temp = inputTestCase[i]; //자리바꾸기
  arr[i] = arr[min];
  arr[min] = temp;
}

버블정렬과 비슷한 것 같지만, 버블 정렬은 정렬된 상태인 경우 중간에 중단이 가능합니다. 하지만 선택 정렬의 경우 비교 연산을 계속 수행해야 합니다.

 

⏰ 시간복잡도

선택 정렬의 시간복잡도는 어떻게 될까요? 정렬을 해야 할 최악의 경우, 즉 단 한 글자도 제자리에 있지 않은 다음과 같은 배열이 있다고 생각해봅시다.

let arr = [5, 4, 2, 3, 1];

 

무한루프가 1번 돌 경우 [1, 4, 2, 3, 5];

2번째 돈 경우 [1, 3, 2, 4, 5];
3번째 돈 경우 [1, 2, 3, 4, 5];
4번째에서 마지막으로 확인 후 종료되게 됩니다.

 

위와 같이 무한루프는 총 4번을 돌며, 한번 돌 때마다 내부 for문은 순서대로 4, 3, 2, 1 번 돌게 됩니다. 

 

따라서 길이가 n인 배열의 선택 정렬의 시간복잡도는 ((n-1) + (n-2) + .... + 1) 이므로 $O(n^2)$으로 표현됩니다.