-
버블 정렬 알고리즘 (Bubble sort Algorithm)알고리즘, 자료구조/정리 2023. 3. 27. 13:48
틀린 내용을 발견하신 경우 말씀 부탁드립니다! 🙇
버블정렬 알고리즘은 서로 인접한 두 개의 값을 비교하여 정렬하는 방식이다. 오름차순 정렬이라고 가정했을 때, 1회전이 끝나면 가장 큰 값이 맨 뒤에 위치하게 되며 각 회전이 끝날 때마다 비교해야하는 값이 하나씩 감소한다. 주어진 배열에서 값을 교환(swap) 하기 때문에 제자리 정렬 알고리즘에 속한다. 값을 정렬할 때 발생하는 교환 작업(swap)이 복잡하기 때문에 단순한 알고리즘임에도 불구하고 잘 쓰이지 않는다.Pseudo code
n개의 요소로 이루어진 (정렬되지 않은) 배열을 오름차순으로 정렬하는 경우,
(1회전 차) 첫 번째 값과 두 번째 값을 비교한다. 작은 값은 첫 번째 인덱스에, 큰 값은 두 번째 인덱스에 놓는다.
(1회전 차) 두 번째 값과 세 번째 값을 비교한다. 작은 값은 두 번째 인덱스에, 큰 값은 세 번째 인덱스에 놓는다.
...
(1회전 차) n-1번째 값과 n번째 값을 비교한다. 작은 값은 n-1번째 인덱스에, 큰 값은 n번째 인덱스에 놓는다.
(2회전 차) 첫 번째 값과 두 번째 값을 비교한다. 작은 값은 첫 번째 인덱스에, 큰 값은 두 번째 인덱스에 놓는다.
...
(2회전 차) n-2번째 값과 n-1번째 값을 비교한다. 작은 값은 n-2번째 인덱스에, 큰 값은 n-1번째 인덱스에 놓는다.
(3회전 차) 첫 번째 값과 두 번째 값을 비교한다. 작은 값은 첫 번째 인덱스에, 큰 값은 두 번째 인덱스에 놓는다.
...
n-1 번 회전을 한 후 정렬을 종료한다.Python code
def bubblesort(list): for i in reversed(range(len(list))): for j in range(i): if list[j] > list[j+1]: list[j], list[j+1] = list[j+1], list[j] return list bubblesort([3,4,0,1,5,6,2]) # result: [0, 1, 2, 3, 4, 5, 6]
시간복잡도
버블 정렬 알고리즘의 시간복잡도는 O(N^2)이다.
(n - 1) + (n - 2) + ... 2 + 1 = n(n - 1) /2 → O(N^2)장단점
장점
- 단순하고 직관적이다.
- 제자리 정렬이므로 추가적인 메모리가 거의 필요없다.
- 안정 정렬(Stable sort)이다.
→ 안정 정렬이 장점인 이유: 값이 동일한 경우 입력 순서를 기준으로 정렬해야하는 경우가 있을 수 있기 때문이다.
단점
- 시간 측면에서 비효율적이다.
- 교환(swap) 연산이 많이 발생하며, 올바른 위치에 있는 값이라도 최종 정렬이 되기 전까지는 자리가 교환될 수 있다.
참고 자료
- https://blog.naver.com/PostView.nhn?blogId=raylee00&logNo=222070980588&parentCategoryNo=&categoryNo=89&viewDate=&isShowPopularPosts=true&from=search
- https://velog.io/@cookncoding/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B0%9C%EB%85%90-Stable-Sort-Inplace
- https://gyoogle.dev/blog/algorithm/Bubble%20Sort.html
- https://gmlwjd9405.github.io/2018/05/06/algorithm-bubble-sort.html
- https://www.freecodecamp.org/news/bubble-sort-algorithm-in-java-cpp-python-with-example-code/
'알고리즘, 자료구조 > 정리' 카테고리의 다른 글
선택 정렬 알고리즘 (Selection sort Algorithm) (0) 2023.03.18 퀵 정렬 알고리즘 (Quick sort Algorithm) (0) 2023.03.14 이진 탐색 알고리즘 (Binary search Algorithm) (0) 2020.08.10 동적 계획법 알고리즘 (Dynamic programming Algorithm) (2) 2020.07.30 너비 우선 탐색 알고리즘 (BFS Algorithm) (0) 2020.07.18