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

2022. 11. 17. 14:01·개발/알고리즘
728x90
반응형

1. 버블정렬

(1) 개념

버블정렬의 개념은 배열을 가장 작은 숫자에서 가장 큰 숫자순으로 오름차순으로 정렬을 한다면 

더 큰 숫자가 한번에 하나씩 뒤로 이동한다.

(2) 예시

[5,1,2,3,4]
[1,5,2,3,4]
[1,2,5,3,4]
[1,2,3,5,4]
[1,2,3,4,5]

(3) 코드

function bubbleSort(arr) {
  const swap = (arr, idx1, idx2) => {
    [arr[idx1], arr[idx2]] = [arr[idx2], arr[idx1]];
  };

  for (let i = arr.length; i > 0; i--) {
    for (let j = 0; j < i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        swap(arr, j, j + 1);
      }
    }
  }
  return arr;
}

bubbleSort([8, 1, 2, 3, 4, 5, 6, 7]);

위의 코드는 정렬이 완료되도 모든 for문을 돌아야 종료되기 때문에 효율성이 좋지 않다.

그렇기 때문에 변수하나를 추가하여 변경된 값이 있는지 확인해준다.

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;
      }
    }
    if (noSwaps) break;
  }
  return arr;
}

(4) 시간복잡도

버블정렬은 기본적으로 2중for문이 들어가 있기 때문에 시간복잡도는 O(n^2) 이다.

하지만 데이터가 거의 정렬되어있거나 이미 끝난상태에서는 O(n)에 더 가깝다.

최악의 경우 : 모든 for문을 다 실행한 경우

최상의 경우 : 데이터가 거의 정렬되어있는경우, 이미 정렬이 끝난 경우

2. 선택정렬

(1) 개념

선택정렬은 작은 값을 한번에 하나씩 위치시킨다.

버블정렬과 마찬가지로 처음부터 끝까지 움직이지만 실제 정렬된 데이터는 처음부터 누적되고 있다.

(2) 예시

[5,3,4,1,2]
[1,3,4,5,2]
[1,2,4,5,3]
[1,2,3,5,4]
[1,2,3,4,5]

(3) 코드

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

      if (j == arr.length - 1) {
        [arr[i], arr[index]] = [arr[index], arr[i]];
      }
    }
  }
  return arr;
}

(4) 시간복잡도

기본적으로 시간복잡도는 O(n^2)이다.

버블정렬보다 효율이 좋은 경우는 스왑수를 최소화 하는 경우이다.

3. 삽입정렬

(1) 개념

배열을 점차적으로 정렬해 나아가는 방식이다.

각 요소를 취하여 정렬되어있는 배열속 위치를 찾아 위치시킨다.

(2) 예시

[5,3,4,1,2]
[3,5,4,1,2]
[3,4,5,1,2]
[1,3,4,5,2]
[1,2,3,4,5]

(3) 코드

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;
}

(4) 시간복잡도

기본적으로 O(n^2)이다.

데이터가 거의 정렬되어있다면 O(n)이다.

유리한 상황 : 적절한 위치에 항목을 삽입하기 때문에 라이브,스트리밍 방식으로 들어온 데이터를 즉시 입력해야할때

불리한 상황 : 반대로 정렬되어 있는경우

728x90
반응형

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

[알고리즘] 퀵정렬  (0) 2022.11.22
[알고리즘] 합병정렬  (0) 2022.11.22
[알고리즘] 선형검색, 이진검색  (0) 2022.11.15
[알고리즘] 재귀함수 문제 모음  (31) 2022.11.15
[알고리즘] 재귀함수  (0) 2022.11.14
'개발/알고리즘' 카테고리의 다른 글
  • [알고리즘] 퀵정렬
  • [알고리즘] 합병정렬
  • [알고리즘] 선형검색, 이진검색
  • [알고리즘] 재귀함수 문제 모음
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CSS
    하이퍼레저
    erc20
    node
    js
    React
    go언어
    mysql
    html
    30일챌린지
    도커
    명령어
    블록체인
    ERC721
    컨테이너
    30일 챌린지
    node.js
    nodejs
    go
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[알고리즘] 버블정렬, 선택정렬, 삽입정렬
상단으로

티스토리툴바