코딩테스트/알고리즘 (Python) ★★★

[알고리즘1] 기본 정렬 (버블/삽입/선택)

개발자딥게 2022. 7. 26. 12:16
반응형

정렬1 : 버블 정렬 (bubble sort)

버블정렬이란, 

인접한 두개의 데이터를 비교해서, 앞에 있는 데이터가 뒤에 있는 데이터보다 크면 자리를 바꾸는 알고리즘이다.

참고: https://visualgo.net/en/sorting

 

bubble sort 함수 생성

이중 반복문으로 큰 순서대로 값을 하나씩 오른쪽으로 이동시켜나감

중간에 swap 변수가 있는 이유는, 이미 정렬이 되었는데도 불필요한 반복문을 수행하는 것을 막기 위함.

두번째 반복문에서 -i 만큼 덜 반복하는 이유는, i회차일 땐 큰 수들 i개가 이미 정렬 완료 됐기 떄문임.

def bubblesort(data):
    for i in range(len(data)-1):
        swap = False
        for j in range(len(data)-i-1):
            if data[j] > data[j+1]:
                data[j], data[j+1] = data[j+1], data[j] # swap
                swap = True
                
            print(data)
        if swap == False: 
            break
        print()
    return data
data = [22,4,7,3,8,9,4,2,9,6]
print(data,"\n")
print(bubblesort(data))

수행되는 과정

원래 배열 10개 
[22, 4, 7, 3, 8, 9, 4, 2, 9, 6] 

i=0 인 경우, 가장 큰 수(22)가 맨 오른쪽으로 정렬된다.
총 9번 반복
[4, 22, 7, 3, 8, 9, 4, 2, 9, 6]
[4, 7, 22, 3, 8, 9, 4, 2, 9, 6]
[4, 7, 3, 22, 8, 9, 4, 2, 9, 6]
[4, 7, 3, 8, 22, 9, 4, 2, 9, 6]
[4, 7, 3, 8, 9, 22, 4, 2, 9, 6]
[4, 7, 3, 8, 9, 4, 22, 2, 9, 6]
[4, 7, 3, 8, 9, 4, 2, 22, 9, 6]
[4, 7, 3, 8, 9, 4, 2, 9, 22, 6]
[4, 7, 3, 8, 9, 4, 2, 9, 6, 22]

i=1인 경우, 두번째 큰수(9)가 오른쪽으로 정렬된다.
마지막22를 제외한 총 8번 반복
[4, 7, 3, 8, 9, 4, 2, 9, 6, 22]
[4, 3, 7, 8, 9, 4, 2, 9, 6, 22]
[4, 3, 7, 8, 9, 4, 2, 9, 6, 22]
[4, 3, 7, 8, 9, 4, 2, 9, 6, 22]
[4, 3, 7, 8, 4, 9, 2, 9, 6, 22]
[4, 3, 7, 8, 4, 2, 9, 9, 6, 22]
[4, 3, 7, 8, 4, 2, 9, 9, 6, 22]
[4, 3, 7, 8, 4, 2, 9, 6, 9, 22]

22,9를 제외한 총 7번 반복
[3, 4, 7, 8, 4, 2, 9, 6, 9, 22]
[3, 4, 7, 8, 4, 2, 9, 6, 9, 22]
[3, 4, 7, 8, 4, 2, 9, 6, 9, 22]
[3, 4, 7, 4, 8, 2, 9, 6, 9, 22]
[3, 4, 7, 4, 2, 8, 9, 6, 9, 22]
[3, 4, 7, 4, 2, 8, 9, 6, 9, 22]
[3, 4, 7, 4, 2, 8, 6, 9, 9, 22]

총 6번 반복
[3, 4, 7, 4, 2, 8, 6, 9, 9, 22]
[3, 4, 7, 4, 2, 8, 6, 9, 9, 22]
[3, 4, 4, 7, 2, 8, 6, 9, 9, 22]
[3, 4, 4, 2, 7, 8, 6, 9, 9, 22]
[3, 4, 4, 2, 7, 8, 6, 9, 9, 22]
[3, 4, 4, 2, 7, 6, 8, 9, 9, 22]

총 5번 반복
[3, 4, 4, 2, 7, 6, 8, 9, 9, 22]
[3, 4, 4, 2, 7, 6, 8, 9, 9, 22]
[3, 4, 2, 4, 7, 6, 8, 9, 9, 22]
[3, 4, 2, 4, 7, 6, 8, 9, 9, 22]
[3, 4, 2, 4, 6, 7, 8, 9, 9, 22]

총 4번 반복
[3, 4, 2, 4, 6, 7, 8, 9, 9, 22]
[3, 2, 4, 4, 6, 7, 8, 9, 9, 22]
[3, 2, 4, 4, 6, 7, 8, 9, 9, 22]
[3, 2, 4, 4, 6, 7, 8, 9, 9, 22]

총 3번 반복
[2, 3, 4, 4, 6, 7, 8, 9, 9, 22]
[2, 3, 4, 4, 6, 7, 8, 9, 9, 22]
[2, 3, 4, 4, 6, 7, 8, 9, 9, 22]

총 2번 반복
[2, 3, 4, 4, 6, 7, 8, 9, 9, 22]
[2, 3, 4, 4, 6, 7, 8, 9, 9, 22]
[2, 3, 4, 4, 6, 7, 8, 9, 9, 22]

정렬이 완료되어 swap = False이므로 더이상 정렬 진행 필요 없음.

 

 

 

 

 

 


정렬2 : 삽입 정렬 (insertion sort)

삽입정렬이란,

해당 인덱스 앞에 있는 데이터부터 비교해서 key값이 더 작으면 데이터를 뒤의 인덱스로 복사한다.

버블정렬은 데이터 swap 수준을 수십번 반복했다면, 삽입정렬은 교환할때 한번에 제 자리에 도착할때까지 swap해준다고 보면 된다.

def insertion_sort(data):
    for i in range(len(data)-1):
        for j in range(i+1,0,-1):
            if data[j] < data[j-1]:
                data[j], data[j-1] = data[j-1], data[j]
            else:
                break
            print(data)
        print()
    return data
data = [33,1,7,3,8,3,7,8,4,66]
print(data,'\n')
print(insertion_sort(data))​

수행 되는 과정

초기 데이터
[33, 1, 7, 3, 8, 3, 7, 8, 4, 66] 

두번째 값(33)의 위치 찾아주기. swap 필요없음
[1, 33, 7, 3, 8, 3, 7, 8, 4, 66]

세번째값(7)의 위치를 찾아 swap 1회
[1, 7, 33, 3, 8, 3, 7, 8, 4, 66]

네번째값(3)의 위치를 찾아 swap 2회
[1, 7, 3, 33, 8, 3, 7, 8, 4, 66]
[1, 3, 7, 33, 8, 3, 7, 8, 4, 66]

다섯번째값(8)의 위치를 찾아 swap 1회
[1, 3, 7, 8, 33, 3, 7, 8, 4, 66]

여섯번째값(3)의 위치를 찾아 swap 3회
[1, 3, 7, 8, 3, 33, 7, 8, 4, 66]
[1, 3, 7, 3, 8, 33, 7, 8, 4, 66]
[1, 3, 3, 7, 8, 33, 7, 8, 4, 66]

일곱번째값(7)의 위치를 찾아 swap 2회
[1, 3, 3, 7, 8, 7, 33, 8, 4, 66]
[1, 3, 3, 7, 7, 8, 33, 8, 4, 66]

여덟번째값(8)의 위치를 찾아 swap 1회
[1, 3, 3, 7, 7, 8, 8, 33, 4, 66]

아홉번째값(4)의 위치를 찾아 swap 5회
[1, 3, 3, 7, 7, 8, 8, 4, 33, 66]
[1, 3, 3, 7, 7, 8, 4, 8, 33, 66]
[1, 3, 3, 7, 7, 4, 8, 8, 33, 66]
[1, 3, 3, 7, 4, 7, 8, 8, 33, 66]
[1, 3, 3, 4, 7, 7, 8, 8, 33, 66]

마지막값(66)은 swap 필요없음
[1, 3, 3, 4, 7, 7, 8, 8, 33, 66]

 

 

 


정렬3 : 선택 정렬 (selection sort)

 

선택정렬이란,

데이터 중 최소값을 찾아 맨 앞에 배치

두번째로 작은 값을 찾아 앞에서 두번쨰 자리에 배치

이를 반복하며 정렬을 완료한다.

 

가장 작은 값의 인덱스를 min_val 이라는 변수에 저장하여 사용함.

def selection_sort(data):
    for i in range(len(data)-1):
        min_val = i
        for j in range(i+1,len(data)):
            if data[min_val] > data[j]:
                min_val = j
        data[i], data[min_val] = data[min_val], data[i]
        print(data,data[i],',',data[min_val],' swap')
    return data
data = [9,5,7,6,8,3,2,1,4,0]
print(data,'\n')
print(selection_sort(data))

수행 되는 과정

[9, 5, 7, 6, 8, 3, 2, 1, 4, 0] 

[0, 5, 7, 6, 8, 3, 2, 1, 4, 9] 0 과 9  swap
[0, 1, 7, 6, 8, 3, 2, 5, 4, 9] 1 과 5  swap
[0, 1, 2, 6, 8, 3, 7, 5, 4, 9] 2 과 7  swap
[0, 1, 2, 3, 8, 6, 7, 5, 4, 9] 3 과 6  swap
[0, 1, 2, 3, 4, 6, 7, 5, 8, 9] 4 과 8  swap
[0, 1, 2, 3, 4, 5, 7, 6, 8, 9] 5 과 6  swap
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 6 과 7  swap
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 7 과 7  swap
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 8 과 8  swap
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

반응형