일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 파이썬
- Cross entropy
- DP
- Natural Language Processing with PyTorch
- 강의정리
- rnn
- tensorflow
- 홍콩과기대김성훈교수
- loss
- AI
- DynamicProgramming
- Python
- 정렬
- BAEKJOON
- Deep learning
- 백준
- Hypothesis
- pytorch
- classifier
- 머신러닝
- 스택
- 강의자료
- 머신러닝 기초
- machine learning
- 자연어처리
- 파이토치
- 딥러닝
- Softmax
- 알고리즘
- MSE
- Today
- Total
개발자의시작
[알고리즘][버블정렬][BubbleSort][정렬][파이썬][Python]-정리 및 코드 본문
[알고리즘][버블정렬][BubbleSort][정렬][파이썬][Python]-정리 및 코드
LNLP 2020. 3. 23. 19:43Bubble Sort(버블 정렬)
버블 정렬은 삽입 정렬, 선택 정렬과 함께 가장 기본적인 정렬 알고리즘에 해당됩니다. 데이터를 처리하는 데 있어서 정렬은 가장 기본적이면서도 핵심적인 내용입니다.
아이디어
버블 정렬의 아이디어는 전체 데이터중 가장 큰 값을 맨뒤로 보내는 것입니다. 그렇기 때문에 버블 정렬의 전체 과정을 살펴보면 뒤에서부터 앞으로 정렬되는 과정을 보입니다. 전체 데이터 중 가장 값이 큰 데이터를 맨뒤로 보낸 후, 이미 정렬된 값을 제외한 데이터중 가장 값이 큰 데이터를 맨 뒤로 보냅니다. 이와 같은 과정을 계속해서 반복하면 데이터가 오름차순으로 정렬이 되는 것을 확인할 수 있습니다. 아래에서 구체적인 방법과 코드를 통해 알 수 있는데, 데이터를 비교하고 큰 값을 계속해서 뒤로 보내는데 이 과정이 마치 거품 같다고 하여 버블 정렬이라는 이름을 갖습니다.
알고리즘
버블 정렬의 알고리즘은 다음과 같습니다. 정렬 되지 않은 무작위의 숫자가 리스트에 저장되어 있고 오름차순으로 정렬을 한다고 가정합니다.
예 : [ 3, 2, 4, 5, 1 ] ( 정렬 되지 않은 리스트)
먼저 맨 앞의 3과 그 다음 값인 2를 비교합니다. 3이 더 큰 값이므로 3과 2의 위치를 바꿔 줍니다.
결과 1. [ 2, 3, 4, 5, 1 ]
이제 3과 그 다음 값인 4를 비교합니다. 4가 더 큰 값이므로 데이터는 그대로 유지됩니다.
결과 2. [ 2, 3, 4, 5, 1 ]
이제 4와 그 다음 값인 5를 비교합니다. 5가 더 큰 값이므로 데이터는 그대로 유지됩니다.
결과 3. [ 2, 3, 4, 5, 1 ]
이제 5과 그 다음 값인 1을 비교합니다. 5가 더 큰 값이므로 5와 1의 위치를 바꿔 줍니다.
결과 4. [ 2, 3, 4, 1, 5 ]
여기까지 한 사이클이 돌았습니다. 그 결과 전체 데이터중 가장 큰 값인 5가 맨 뒤로 이동한 것을 확인할 수 있습니다. 그다음 사이클을 살펴봅니다.
다시 맨 앞의 2와 그 다음 값인 3을 비교합니다. 3이 더 큰 값이므로 데이터는 그대로 유지됩니다.
결과 5. [ 2, 3, 4, 1, 5 ]
이제 3과 그 다음 값인 4를 비교합니다. 4가 더 큰 값이므로 데이터는 그대로 유지됩니다.
결과 6. [ 2, 3, 4, 1, 5 ]
이제 4와 그 다음 값인 1을 비교합니다. 4가 더 큰 값이므로 4와 1의 위치를 바꿔 줍니다.
결과 7. [ 2, 3, 1, 4, 5 ]
여기까지 두 번째 사이클이 돌았고, 4와 5가 정렬된 것을 확인할 수 있습니다. 이와 같은 과정을 계속해서 반복하면 전체 데이터가 오름차순으로 정렬된 것을 확인할 수 있습니다.
시간 복잡도 Big(O)
버블 정렬은 한 싸이클이 반복되면서 리스트의 처음부터 맨 마지막까지 비교를 진행하며 최대 O(N)의 시간 복잡도를 갖습니다. 여기에 사이클이 반복될 때마다 다시 비교를 진행하므로 각 사이클당 최대 약 O(N)의 시간 복잡도를 필요로 합니다. 즉 전체 데이터를 정렬하는 데는 최대 O(N) * O(N)= O(N^2)의 시간 복잡도를 갖습니다. 내림 차순으로 정렬되어 있는 경우가 가장 많은 스왑(Swap)이 필요하며 O(N^2)이 시간이 필요하게 됩니다. 만약 내림차순으로 정렬되어 있는 데이터를 정렬할 때는 O(N)의 시간 복잡도가 필요합니다.
영상으로 이해하기
이해가 안가시는 분들을 위해 버블 정렬을 눈으로 쉽게 이해할 수 있는 영상을 첨부하였습니다. 영상을 보면서 데이터가 이동하는 흐름을 살펴보면 알고리즘을 이해하는데 도움이 될 것이라 생각합니다.
소스코드
#Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def Bubble_sort(li):
for i in range(len(li)-1):
print(li)
for j in range(len(li)-i-1):
if li[j]>li[j+1]:
temp=li[j+1]
li[j+1]=li[j]
li[j]=temp
if __name__ =="__main__":
list_a=[ 10-i for i in range(10) ]
Bubble_sort(list_a)
print(list_a)
|
중간 중간 print()를 추가하여 데이터가 스왑(Swap)하는 과정을 눈으로 확인할 수 있도록 작성하였습니다.
오류 또는 더 좋은 풀이 방법이 있다면 댓글로 남겨주세요.
'알고리즘(Algorithm) > 기초(Basic)알고리즘' 카테고리의 다른 글
[알고리즘][병합정렬][MergeSort][정렬][파이썬][Python]-정리 및 코드 (0) | 2021.09.03 |
---|---|
[알고리즘][퀵정렬][QuickSort][정렬][파이썬][Python]-정리 및 코드 (0) | 2021.09.03 |
[알고리즘][삽입정렬][InsertionSort][정렬][파이썬][Python]-정리 및 코드 (0) | 2020.03.23 |
[알고리즘][선택정렬][SelectionSort][정렬][파이썬][Python]-정리 및 코드 (0) | 2020.03.23 |