정렬 알고리즘

Jin·2023년 6월 8일

Algorithm

목록 보기
12/13
post-thumbnail

선택정렬(Selection Sort)

  • 선택정렬은 매 단계에서 가장 작은 원소를 선택해서 앞으로 보내는 정렬 방법이다.
  • O(N^2)로 비효율적인 정렬 알고리즘이지만, 데이터의 갯수가 적고, 빠르게 작성할 수 있기 때문에 알고 있으면 좋다.

동작 원리

  • 각 단계에서 가장 작은 원소를 선택한다.
  • 현재까지 처리되지 않은 원소들 중 가장 앞의 원소와 위치를 교체한다.

동작 예시

[2, 4, 3, 1, 9, 6, 8, 7, 5] 배열이 있다고 가정해보자

[1단계] 가장 작은 원소인 1을 선택해 아래와 같은 배열을 만든다.

[1, 4, 3, 2, 9, 6, 8, 7, 5]

[2단계] 그 다음 작은 원소인 2를 선택해 아래와 같은 배열을 만든다.

[1, 2, 3, 4, 9, 6, 8, 7, 5]

[3단계] 

[1, 2, 3, 4, 9, 6, 8, 7, 5]

[4단계]

[1, 2, 3, 4, 9, 6, 8, 7, 5]


[5단계]

[1, 2, 3, 4, 5, 6, 8, 7, 9]

[6단계]

[1, 2, 3, 4, 5, 6, 7, 8, 9]

[7단계]

[1, 2, 3, 4, 5, 6, 7, 8, 9]

[8단계]

[1, 2, 3, 4, 5, 6, 7, 8, 9]

코드 예시

function selectionSort(arr) {
	for (let i = 0; i < arr.length; i++) {
      let minIndex = i;
      for (let j = i+1; j < arr.length; j++) {
        if(arr[minIndex] > arr[j]) {
          minIndex = j;
        }
      }
      // swap
      let temp = arr[i];
      arr[i] = arr[minIndex];
      arr[minIndex] = temp;
    }
}

버블정렬 (Bubble Sort)

  • 인접한 두개의 원소를 확인해서, 정렬이 되어 있지 않다면 위치를 서로 바꿔준다.
  • O(N^2)으로 비효율적인 알고리즘이다.

동작 원리

  • 서로 인접한 두 개의 원소를 비교해서, 필요하다면 위치를 서로 바꾸어준다.
  • 한번의 단계가 수행되면, 가장 큰 원소가 맨 뒤로 이동한다.
  • 하나의 단계를 거칠 때마다 가장 큰 값을 확실하게 결정한다.

동작 예시

[9, 8, 2, 4, 3] // 정렬할 배열

[1단계]
[8, 9, 2, 4, 3] -> [8, 2, 9, 4, 3] -> [8, 2, 4, 9, 3] -> [8, 2, 4, 3, 9]

[2단계]
[2, 8, 4, 3, 9] -> [2, 4, 8, 3, 9] -> [2, 4, 3, 8, 9]

[3단계] 
[2, 3, 4, 8, 9]

[4단계]
[2, 3, 4, 8, 9]

[5단계]
[2, 3, 4, 8, 9]

코드 예시

function bubbleSort(arr) {
 for (let i = arr.length - 1; i > 0; i--) {
  	 for (let j = 0; j < i; j++) {
       if (arr[j] < arr[j + 1]) {
         let temp = arr[j];
         arr[j] = arr[j + 1];
         arr[j + 1] =temp;
       }
     }
 }
}

삽입 정렬(Insertion Sort)

  • 삽입 정렬이란, 말 그대로 각 숫자를 적절한 위치에 삽입하는 정렬 기법이다.
  • 이미 정렬이 완료되어 있는 경우 동작이 매우 빠르다.

동작 원리

  • 각 단계마다 원소가 삽입될 적절한 위치를 찾는다.
  • 적절한 위치에 도달할 때까지 반복적으로 왼쪽으로 이동한다.
  • 최악의 경우 O(N^2)의 복잡도를 갖는다.

동작 예시

[2, 4, 3, 1, 9, 6, 8, 7, 5] // 정렬할 배열, 첫번째 원소는 정렬이 되어 있다고 가정한다.

[1단계]
[2, 4, 3, 1, 9, 6, 8, 7, 5]

[2단계]
[2, 3, 4, 1, 9, 6, 8, 7, 5]

[3단계]
[1, 2, 3, 4, 9, 6, 8, 7, 5]

[4단계]
[1, 2, 3, 4, 9, 6, 8, 7, 5]

[5단계]
[1, 2, 3, 4, 6, 9, 8, 7, 5]

[6단계]
[1, 2, 3, 4, 6, 8, 9, 7, 5]

[7단계]
[1, 2, 3, 4, 6, 7, 8, 9, 5]

[8단계]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

코드 예시

function insertionSort(arr) {
  for (let i = 0; i < arr.length; i++) {
   	for (let j = i; j > 0; j--) {
     	if(arr[j] < arr[j - 1]) {
         	let temp = arr[j];
          	arr[j] = arr[j - 1];
          	arr[j - 1] = temp;
        } else {
          break;
        }
    }
  }
}
profile
Nothing changes if nothing changes

0개의 댓글