강의/알고리즘

[알고리즘] 버블,선택,삽입 정렬

호팍이네 2022. 12. 23. 12:36

정렬 알고리즘은 재배열하는 것.

아래 3가지의 정렬을 데이터의 크기가 작을 때 유용하다.

1. 버블 정렬

  • 그다지 효율적이지 않고 잘 쓰이지 않는다.
  • 해당 인덱스와 다음 인덱스의 크기를 비교하면서 정렬을 한다.
  • 가장 큰 값이나 가장 작은 값을 하나씩 맞춰가는 것. 이를 반복하면서 정렬을 한다.
  • 하나씩 값이 고정되기 때문에 정렬해야 하는 항목의 수가 감소한다.
  • 시간 복잡도는 O(n) ~ O(n^2)
function bubbleSort(arr){
  var noSwaps; // 최적화를 위해 변수 선언
  for(var i = arr.length; i > 0; i--){ //가장 우측의 값을 정하니 인덱스가 하나씩 줄어듦
    noSwaps = true;
    for(var j = 0; j < i - 1; j++){
      if(arr[j] > arr[j+1]){
        var temp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = temp;
        noSwaps = false; //만약 변동사항이 있다면 false -> for 루프 다시 반복
       }
     }
     if(noSwaps) break; //변동사항 없다면 true -> break;
   }
   return arr;
  }

 

2. 선택 정렬

  • 버블 정렬과는 반대로 작은 값부터 정렬을 한다.
  • 순서대로 탐색을 하면서 최솟값을 찾고, 현재의 최솟값보다 더 작은 값을 찾는다. 더 작은 최솟값이 나오면 최신 최솟값으로 변경하고, 더 이상 더 작은 값이 나오지 않으면 첫 번째 값과 자리를 변경한다.
  • 시간 복잡도는 O(n^2)
function sselectionSort(arr){
    for(var i = 0; i < arr.length; i++){
        var lowest = i;
        for(var j = i+1; j < arr.length; j++){
            if(arr[j] < arr[lowest]){
                lowest = j;
            }
        }
        if(i !== lowest){ // 처음에 시작한 값이 최솟값일 경우는 바꾸지 않고 그대로 냅둔다.
            //SWAP!
            var temp = arr[i];
            arr[i] = arr[lowest];
            arr[lowest] = temp;
        }
    }
    return arr;
}

 

3. 삽입 정렬

  • 2개의 요소를 비교하며 최소값이나 최댓값을 하나씩 맞춰가는 게 아닌, 정렬을 마친 묶음과 다음 인덱스를 비교하여 정렬한 것을 쌓아가는 형식이다.
  • 다음 인덱스의 값을 정렬을 마침 묶음 속으로 파고 들면서 하나씩 비교하면서 자리를 다시 채워 넣는다.
  • 데이터를 계속 정렬해야 할 경우에 효과가 좋다. (새 요소를 추가할 경우)
  • 시간 복잡도 O(n)~O(n^2)
function insertionSort(arr){
	var currentVal;
    for(var i = 1; i < arr.length; i++){
        currentVal = arr[i];
        for(var j = i - 1; j >= 0 && arr[j] > currentVal; j--) {
            arr[j+1] = arr[j]
        }
        arr[j+1] = currentVal;
    }
    return arr;
}