[TS] 타입스크립트로 구현해 본 정렬 알고리즘 #1 (버블 정렬, 선택 정렬, 삽입 정렬)

2021. 5. 19. 16:26·개발/Typescript
728x90

정렬 알고리즘

[의미]

  • 무작위로 섞여있는 데이터를 어떠한 기준에 맞추어 정리하는 알고리즘.

[사용하는 경우]

  1. 각종 데이터의 목록을 정리하고 싶을 때
  2. 분포도의 중위값을 알아내고 싶을 때
  3. 데이터에서 중복 값을 파악하고 싶을 때
  4. 이진 탐색을 하려고 할 때

[공부하는 이유]

  • 기본적으로 제공되는 시스템 정렬(sort 매서드)이 항상 좋은 퍼포먼스를 보장하지는 않음.
  • 환경과 상황에 걸 맞는 정렬을 사용하는 것이 중요하기 때문.

버블 정렬(Bubble Sort)

버블 정렬 원리 사진 (1회차 中)

[의미]

  • 인접한 두 개의 데이터에 크기를 비교한 후 대소관계에 따라 두 값의 교환여부를 판단하는 알고리즘.

[특징]

  • N번째 정렬 회차가 끝나면, 뒤에서 n번째 자리의 데이터가 확정됨.
  • Stable한 정렬 (중복된 데이터의 순서가 바뀌지 않는 정렬)

[Big O]

  • Best - O(n)
  • Worst - O(n²)

[장점]

  • In-Place 알고리즘 (데이터가 저장된 공간 내에서 정렬됨)
  • In-Place 알고리즘 특성으로 추가적인 메모리를 필요로 하지 않아 메모리가 절약됨.

[단점]

  • 자료의 개수가 많아질수록 성능이 매우 떨어짐.

[구현]

// Bubble Sort

function BubbleSort(...array: number[]): number[] {
    console.time();
    let swap: number;
    for(let i = 0; i < array.length; i++) {
        for(let j = 0; j < array.length -1 -i; j++) {
            if(array[j] > array[j + 1]){
                swap = array[j];
                array[j] = array[j + 1];
                array[j + 1] = swap;
            }
        }
        console.log(array); // check
    }
    console.timeEnd();
    return array;
}

console.log(`Result: ${BubbleSort(5,1,3,2,4)}`);


-----[결과]-----
[ 1, 3, 2, 4, 5 ]
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4, 5 ]
default: 5.84ms
Result: 1,2,3,4,5

선택 정렬(Selection Sort)

선택 정렬 사진

[의미]

  • 매 회차마다 정렬이 되어 있지 않은 데이터들 중 최소값을 찾아 앞부터 차례적으로 정렬하는 알고리즘.

[특징]

  • N번째 정렬 회차가 끝나면, 앞에서 n번째 자리의 데이터가 확정됨.
  • UnStable한 정렬 (중복된 데이터의 순서가 바뀔수도 있는 정렬)

[Big O]

  • Best - O(n²)
  • Worst - O(n²)

[장점]

  • In-Place 알고리즘 (데이터가 저장된 공간 내에서 정렬됨)
  • In-Place 알고리즘 특성으로 추가적인 메모리를 필요로 하지 않아 메모리가 절약됨.

[단점]

  • 최선의 경우이든 최악의 경우이든, 성능이 O(n^2)으로 성능이 매우 떨어짐.

[구현]

// Selection Sort

function SelectionSort(...array: number[]) {
    console.time();
    let minIndex: number;
    let swap: number;
    for(let i = 0; i < array.length; i++) {
        minIndex = i;
        
        for(let j = i + 1; j < array.length; j++) {
            if(array[minIndex] > array[j]) { minIndex = j; }
        }

        if (minIndex != i) {
            swap = array[minIndex];
            array[minIndex] = array[i];
            array[i] = swap;
        }
        console.log(array); // check
    }
    console.timeEnd();
    return array;
}

console.log(`Result: ${SelectionSort(5,1,3,2,4)}`);

-----[결과]-----
[ 1, 5, 3, 2, 4 ]
[ 1, 2, 3, 5, 4 ]
[ 1, 2, 3, 5, 4 ]
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4, 5 ]
default: 5.351ms
Result: 1,2,3,4,5

삽입 정렬(Insertion Sort)

삽입 정렬 사진

[의미]

  • 매 회차마다 기준값을 왼쪽의 정렬되어 있는 데이터들과 비교하여 올바른 위치에 삽입하는 알고리즘.

[특징]

  • 기준값 왼쪽에 있는 값들이 정렬되어 있다는 가정하에 진행됨.
  • Stable한 정렬 (중복된 데이터의 순서가 바뀌지 않는 정렬)

[Big O]

  • Best - O(n)
  • Worst - O(n²)

[장점]

  • In-Place 알고리즘 (데이터가 저장된 공간 내에서 정렬됨)
  • In-Place 알고리즘 특성으로 추가적인 메모리를 필요로 하지 않아 메모리가 절약됨.

[단점]

  • 자료의 개수가 많아질수록 성능이 매우 떨어짐.

[구현]

// Insertion Sort

function InsertionSort(...array: number[]): number[] {
    console.time();
    let leftIndex : number;
    let pivot : number;
    
    for(let i = 1; i < array.length; i++) {
        pivot = array[i];
        leftIndex =  i - 1;

        while(leftIndex >= 0 && array[leftIndex] > pivot) {
            array[leftIndex + 1] = array[leftIndex];
            leftIndex--;
        }  

        array[leftIndex + 1] = pivot;
        console.log(array); // check
    }
    console.timeEnd();
    return array;
}

console.log(`Result: ${InsertionSort(5,4,2,3,1)}`);

-----[결과]-----
[ 4, 5, 2, 3, 1 ]
[ 2, 4, 5, 3, 1 ]
[ 2, 3, 4, 5, 1 ]
[ 1, 2, 3, 4, 5 ]
default: 5.231ms
Result: 1,2,3,4,5

세 알고리즘의 시간복잡도 그래프 비교

그래프를 보았을 때, 데이터의 양이 늘어날 수록 버블 정렬이 시간이 가장 오래 걸리며, 삽입 정렬이 가장 빠름을 알 수 있다.


참고하면 좋은 사이트

 

Bubble Sort Sorting Algorithm - Big-O

Bubble Sort (or sinking sort) is a straight-forward comparison sort algorithm that continuously compares adjacent indexes and swaps them if they are out of order.

big-o.io

'개발 > Typescript' 카테고리의 다른 글

[TS] 타입스크립트로 구현해 본 정렬 알고리즘 #2 (병합 정렬, 퀵 정렬)  (0) 2021.06.05
[Typescript] 단일 연결 리스트 Stack 구조 만들기  (0) 2021.05.08
[Dream Coding TS + OOP] 계획 및 목표  (0) 2021.03.21
Typescript 알아보기  (0) 2020.06.03
'개발/Typescript' 카테고리의 다른 글
  • [TS] 타입스크립트로 구현해 본 정렬 알고리즘 #2 (병합 정렬, 퀵 정렬)
  • [Typescript] 단일 연결 리스트 Stack 구조 만들기
  • [Dream Coding TS + OOP] 계획 및 목표
  • Typescript 알아보기
기짜낭
기짜낭
생각이 많지만, 지금 내가 해야할 것을 하자.
  • 기짜낭
    So tired
    기짜낭
    • 분류 전체보기 (199)
      • 개발 (11)
        • Javascript (19)
        • Typescript (5)
        • Canvas (8)
        • React (13)
        • C (3)
      • 활동 (63)
        • 개인 프로젝트 (33)
        • 나눔 서포터즈 3기 (9)
        • 멋쟁이 사자처럼 (7)
        • 0&1 C++ 자료구조 스터디 (0)
        • 제 9회 창업 아이디어톤 (3)
        • Poom (ZeroWasteShop) (3)
        • 해커톤 (2)
        • 우테코 프리코스 7기 (6)
      • 알고리즘 (27)
        • 알고리즘 정리 (5)
        • 백준 (18)
        • 프로그래머스 (4)
      • 강연 (7)
      • 독서 (18)
      • 회고 & 생각 (16)
        • 연간회고 (4)
      • 기타 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • ※ 예전 블로그
  • 인기 글

  • 태그

    프로그래밍
    개념
    알고리즘
    개발
    에리카
    백준
    3기
    한양대학교
    타입스크립트
    독후감
    Javascript
    TypeScript
    대학
    독서
    react
    HTML5
    canvas
    프론트엔드
    디자인
    tutorial
    우테코
    프로젝트
    ES6
    1주 1권
    HTML
    CSS
    1주에 1권씩
    Erica
    군대
    개발자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
기짜낭
[TS] 타입스크립트로 구현해 본 정렬 알고리즘 #1 (버블 정렬, 선택 정렬, 삽입 정렬)
상단으로

티스토리툴바