SWEA()/Intermediate_Learn

[SWEA]파이썬 SW문제해결 기본 - LIST 1 : Sort(정렬)-버블 정렬

코딩의행복 2021. 10. 15. 10:00

파이썬 SW문제해결 기본 - LIST 1

05 Sort(정렬)-버블 정렬


이미지를 클릭하시면 SW Expert Academy의 해당 강좌로 이동합니다

05. Sort

    ① 정렬 개요

        ▣ 정렬(Sort)이란?

            - 2개 이상의 자료를 특정 기준에 따라 순서대로 재배열하는 것이다.

            - 작은 값부터 큰 값 : 오름차순(ascending)

            - 큰 값부터 작은 값 : 내림차순(descending)

        ▣ 대표적인 정렬 방식의 종류

            - 버블 정렬 : 인접한 두 원소를 검사하여 정렬하는 방법이다. (최악: O(n^2) / 평균: O(n^2))

            - 카운팅 정렬 : 각 항목의 개수를 센(Counting) 후에 정렬하는 방법이다. (최악: O(n+k) / 평균: O(n+k))

            - 선택 정렬 : 최솟값을 찾아 정렬되지 않은 맨 앞의 값과 교체하는 방법이다. (최악: O(n^2) / 평균: O(n^2))

            - 삽입 정렬 : 모든 요소를 이미 정렬된 리스트와 비교하며 위치를 찾아 삽입하는 방법이다. (최악: O(n^2) / 평균: O(n^2))

            - 퀵 정렬 : 하나의 요소(피벗)를 기준으로 리스트를 나눠가며 재귀적으로 정렬하는 방법이다. (최악: O(n^2) / 평균: O(nlogn))

            - 병합(합병) 정렬 : 원소를 하나만 포함하는 n개의 리스트로 분할하고 각 리스트를 병합하며 정렬하는 방법이다. (최악: O(nlogn) / 평균: O(nlogn))

 

위 나열한 정렬 방식 중 이번 포스팅에서는 버블 정렬카운팅 정렬(은 다음 포스팅에 있다)만을 다룬다. 나머지는 추후에 차차 다룰 예정이다.

    ② 버블 정렬

        ▣ 버블 정렬

            - 인접한 두 개의 원소를 비교하며 자리를 계속 교환하는 방식이다.

버블 정렬의 시각화. 세로축은 값, 가로축은 위치(index)로 보면 될 듯 하다. 출처 : wikipedia

            - 정렬 과정

                        1) 첫 번째 원소부터 인접한 원소끼리 계속 자리를 교환하면서 맨 마지막 자리까지 이동한다.

                        2) 한 단계가 끝나면 가장 큰 원소 또는 가장 작은 원소가 마지막 자리로 정렬된다.

                        3) 교환하며 자리를 이동하는 모습이 물 위에 올라오는 거품 모양 같아서 '버블 정렬'이라고 한다.

            - 최악 시간 복잡도 : O(n^2) // 평균 시간 복잡도 : O(n^2)

        ▣ [55, 7, 78, 12, 42]를 버블 정렬(오름차순)하는 과정

첫 번째 반복

[0]과 [1]의 비교. 55가 크다. 서로 위치를 바꾼다.
[1]과 [2]의 비교. 78이 크다. 위치는 그대로 둔다.
[2]와 [3]의 비교. 78이 크다. 위치를 바꾼다.
[3]과 [4]의 비교. 78이 크다. 위치를 바꾼다.
미정렬 리스트의 마지막 인덱스에 도달했으므로 정렬된 위치를 고정한다.

두 번째 반복

[0]과 [1]의 비교. 55가 크다. 위치는 그대로 둔다.
[1]과 [2]의 비교. 55가 크다. 위치를 바꾼다.
[2]와 [3]의 비교. 55가 크다. 위치를 바꾼다.
미정렬 리스트의 마지막 인덱스에 도달했으므로 정렬된 위치를 고정한다.

세 번째 반복(이미 정렬은 완료됐지만 컴퓨터는 정렬의 완료 여부를 알 수 없기에 계속 반복한다.)

[0]과 [1]의 비교. 12가 크다. 그대로 둔다.
[1]과 [2]의 비교. 42가 크다. 그대로 둔다.
미정렬 리스트의 마지막 인덱스에 도달했으므로 정렬된 위치를 고정한다.

네 번째 반복

[0]과 [1]의 비교. 12가 크다. 그대로 둔다.
미정렬 리스트의 마지막 인덱스에 도달했으므로 정렬된 위치를 고정한다.

다섯 번째 반복

이미 미정렬된 리스트의 마지막이므로 비교를 중단한다.

 

            - 버블 정렬의 과정은 위와 같다. 내가 일일이 그림으로 만들며 포스팅하는 데는 이유가 있다. 바로 저번 포스팅에서 언급했던 시간 복잡도를 직접 따라가며 계산하고 이해해보기 위함이다.

            - [7, 12, 42, 55, 78]을 버블 정렬하기 위해 비교는 10번, 교환은 5번 수행됐다. 

            - 버블 정렬의 시간 복잡도는 위에서 언급됐듯 O(n^2)이다.

            - 파이썬으로 이를 구현해보면 다음과 같다.

def bubbleSort(x): #x는 정렬할 LIST
	length = len(x)-1
	for i in range(length):
		for j in range(length-i):
			if x[j] > x[j+1]:
				x[j], x[j+1] = x[j+1], x[j]
	return x

 

원래 계획은 이번 포스팅에서 버블 정렬과 카운팅 정렬을 모두 다루는 것이었으나, 예상외로 포스팅 길이가 길어졌다. 카운팅 정렬은 바로 다음 포스팅에 이어 작성하겠다.