[Algorithm / Java] ✒️ Bubble Sort (거품 정렬)

2022. 8. 15. 01:46·Algorithm & Data Structure/study
728x90

Bubble Sort란?

 Bubble Sort는 Selection Sort와 유사한 알고리즘으로 서로 인접한 두 원소의 대소를 비교하고, 조건에 맞지 않다면 자리를 교환하며 정렬하는 알고리즘이다.

이름의 유래로는 정렬 과정에서 원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 지어졌다고 한다.

 

Process (Ascending)

  1. 1회전에 첫 번째 원소와 두 번째 원소를, 두 번째 원소와 세 번째 원소를, 세 번째 원소와 네 번째 원소를, … 이런 식으로 (마지막-1)번째 원소와 마지막 원소를 비교하여 조건에 맞지 않는다면 서로 교환한다.
  2. 1회전을 수행하고 나면 가장 큰 원소가 맨 뒤로 이동하므로 2회전에서는 맨 끝에 있는 원소는 정렬에서 제외되고, 2회전을 수행하고 나면 끝에서 두 번째 원소까지는 정렬에서 제외된다. 이렇게 정렬을 1회전 수행할 때마다 정렬에서 제외되는 데이터가 하나씩 늘어난다.

 

Code

void bubbleSort(int[] arr) {
    int temp = 0;
	for(int i = 0; i < arr.length; i++) {       // 1.
		for(int j= 1 ; j < arr.length-i; j++) { // 2.
			if(arr[j-1] > arr[j]) {             // 3.
                // swap(arr[j-1], arr[j])
				temp = arr[j-1];
				arr[j-1] = arr[j];
				arr[j] = temp;
			}
		}
	}
	System.out.println(Arrays.toString(arr));
}

 

  1. 제외될 원소의 갯수를 의미한다. 1회전이 끝난 후, 배열의 마지막 위치에는 가장 큰 원소가 위치하기 때문에 하나씩 증가시켜준다.
  2. 원소를 비교할 index를 뽑을 반복문이다. j는 현재 원소를 가리키고, j-1은 이전 원소를 가리키게 되므로, j는 1부터 시작하게 된다.
  3. 현재 가르키고 있는 두 원소의 대소를 비교한다. 해당 코드는 오름차순 정렬이므로 현재 원소보다 이전 원소가 더 크다면 이전 원소가 뒤로 가야 하므로 서로 자리를 교환해준다.

 

GIF로 이해하는 Bubble Sort

https://github.com/GimunLee/tech-refrigerator/blob/master/Algorithm/%EA%B1%B0%ED%92%88%20%EC%A0%95%EB%A0%AC%20(Bubble%20Sort).md#%EA%B1%B0%ED%92%88-%EC%A0%95%EB%A0%AC-bubble-sort

 

시간복잡도

 시간복잡도를 계산하면, (n-1) + (n-2) + (n-3) + .... + 2 + 1 => n(n-1)/2이므로, O(n^2) 입니다. 또한, Bubble Sort는 정렬이 돼있던 안돼 있던, 2개의 원소를 비교하기 때문에 최선, 평균, 최악의 경우 모두 시간복잡도가 O(n^2) 으로 동일합니다. (개선된 Bubble Sort 찾아볼 것)

 

공간복잡도

주어진 배열 안에서 교환(swap)을 통해, 정렬이 수행되므로 O(n) 입니다.

 

장점

  • 구현이 매우 간단하고, 소스코드가 직관적이다.
  • 정렬하고자 하는 배열 안에서 교환하는 방식으로, 다른 메모리 공간을 필요로 하지 않는다. 
    > 제자리 정렬 (in-place sorting)
  • 안정 정렬(Stable Sort)이다.

 

단점

  • 시간복잡도가 최악, 최선, 평균 모두 O(n^2) 으로, 굉장히 비효율적이다.
  • 정렬돼있지 않은 원소가 정렬됐을 때의 자리로 가기 위해서, 교환 연산(swap)이 많이 일어나게 된다.

 

Reference

  • GimunLee / tech-refrigerator / Algorithm / 거품 정렬 (Bubble Sort).md
  • Zedd0202 - 정렬 알고리즘 정리1 (개념/시간복잡도 - O(n^2))
저작자표시 (새창열림)

'Algorithm & Data Structure > study' 카테고리의 다른 글

[Algorithm / Java] ✒️ Selection Sort(선택 정렬)  (0) 2022.08.16
[Data Structure / Java] ✒️ Graph(그래프)  (0) 2022.08.16
[Data Structure / Java] ✒️ Vector  (0) 2022.08.15
[Data Structure / Java] ✒️ Stack, Queue  (0) 2022.08.15
[Data Structure / Java] ✒️ Map  (2) 2022.08.12
'Algorithm & Data Structure/study' 카테고리의 다른 글
  • [Algorithm / Java] ✒️ Selection Sort(선택 정렬)
  • [Data Structure / Java] ✒️ Graph(그래프)
  • [Data Structure / Java] ✒️ Vector
  • [Data Structure / Java] ✒️ Stack, Queue
ro117youshin
ro117youshin
코딩 / 외국어공부 (영어, 중국어) / 독서 등 자기계발을 기록합니다.
  • ro117youshin
    Taking an extra step
    ro117youshin
  • 전체
    오늘
    어제
    • 분류 전체보기 (153)
      • DDD (5)
      • JAVA (13)
      • Spring Boot (2)
      • Spring (4)
      • MySQL (1)
      • C (1)
      • Algorithm & Data Structure (34)
        • study (15)
        • programmers (0)
        • boj (18)
        • assignments (1)
      • CS: Computer Science (6)
        • CS50 2019 (4)
        • Network (2)
        • Database (0)
      • Git (3)
      • foreign language (16)
        • English (0)
        • Chinese (16)
      • BOOK (2)
      • ETC (2)
      • youtube.com|user|egoing2 (64)
        • WEB1 - HTML & Internet (5)
        • WEB2 - CSS (9)
        • WEB2 - JavaScript (18)
        • JavaScript Immutability (0)
        • DATABASE1 (4)
        • DATABASE2 MySQL (12)
        • JAVA1 (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자바
    ddd
    생활코딩
    객체
    baekjoon
    JAVA1
    javascript
    HSK6급모의고사
    HSK6급
    DATABASE2
    코딩공부
    Java
    mysql
    Domain Driven Design
    개발공부
    백준
    Java자료구조
    variable
    css
    HTML
    HSK6급필수어휘
    도메인 주도 설계
    알고리즘문제
    조건문
    BOJ
    HSK6급공부
    js
    최범균
    중국어공부
    나의 앱 만들기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
ro117youshin
[Algorithm / Java] ✒️ Bubble Sort (거품 정렬)
상단으로

티스토리툴바