[Zerobase][알고리즘] 버블정렬, 삽입정렬, 선택정렬 - 문제풀이

솔비·2023년 12월 13일

💻 Python. w/zerobase

목록 보기
29/33
post-thumbnail

⬇️ [알고리즘] 버블정렬, 삽입정렬, 선택정렬 이론


버블정렬


📖 문제

숫자로 이루어진 리스트를 버블정렬 알고리즘을 이용해서
오름차순과 내림차순으로 정렬하는 모듈을 만들어보자
(단, 정렬하는 과정도 출력하도록 한다.)

#bubble 모듈

def bubble_sorted(list,acs = True,deepcopy=True) :
    if deepcopy :
        import copy
        sorted_list = copy.copy(list)
    else :
        sorted_list = list

    for i in range(len(sorted_list)-1):
        for j in range(len(sorted_list)-1):
            if acs:
                if sorted_list[j] > sorted_list[j+1] :
                    sorted_list[j], sorted_list[j+1] = sorted_list[j+1], sorted_list[j]

                print(f'[acs]sorting list : {sorted_list}')

            else :
                if sorted_list[j] < sorted_list[j+1] :
                    sorted_list[j], sorted_list[j+1] = sorted_list[j+1], sorted_list[j]
            print(f'[desc]sorting list : {sorted_list}')

    return sorted_list
#실행파일

import random

list = random.sample(range(1,100),20)
print(f'list : {list}')

import bubble

asc = bubble.bubble_sorted(list,True,True)
print(f'sorted list by asc : {asc}')

desc = bubble.bubble_sorted(list,False,True)
print(f'sorted list by asc : {desc}')

📁 풀이기록

처음엔 acs와 desc 두가지를 return하는 모듈로 코드를 짰으나,
함수 defalt옵션을 사용해서
True일 경우 acs False일 경우 desc를 return하도록
코드를 수정했다.

깊은복사가 defalt일 경우라면
deepcopy를 제외시키고 바로 copy모듈을 사용해서 sorted_list를 생성해도 된다.


삽입정렬


📖 문제

숫자로 이루어진 리스트를 삽입정렬 알고리즘을 이용해서 오름차순과 내림차순으로 정렬하는 모듈
단, 정렬하는 과정도 출력하도록 한다.

#insert모듈

def sorted_fun(list,acs=True,deepcopy=False):

    if deepcopy :
        import copy
        sorted_list = copy.copy(list)
    else :
        sorted_list = list


    for i in range(1,len(sorted_list)):
        for j in range(i,0,-1) :
            if acs :
                if sorted_list[j] < sorted_list[j-1] :
                    sorted_list[j], sorted_list[j-1] = sorted_list[j-1], sorted_list[j]
            else :
                if sorted_list[j] > sorted_list[j-1] :
                    sorted_list[j], sorted_list[j-1] = sorted_list[j-1], sorted_list[j]

        print(f'sorting list : {sorted_list}')

    return sorted_list
#실행파일 

nums = [19,10,3,5,13,4,12,17,8,16]
print(f'nums : {nums}')

import insert

asc = insert.sorted_fun(nums,True)
print(f'sorted nums by asc : {asc}')

desc = insert.sorted_fun(nums,True)
print(f'sorted nums by desc : {desc}')

📁 풀이기록

삽입정렬은 뒤에서 앞과 비교해서 작은수를 앞으로 보내는 정렬 방법이다.
뒤에서 앞과 비교해야하기 때문에

for i in range(1,len(sorted_list)) :

의 range를 1번 인덱스부터 시작하고,
중첩반복문으로 j를 1번 idx까지 -1 로 반복한다.
리스트의j가 j-1과 클 경우 desc 작을경우 asc이다.


선택정렬


📖 문제

숫자로 이루어진 리스트를 선택정렬 알고리즘을 이용해서
오름차순과 내림차순으로 정렬하는 모듈을 만들어보자.

#select 모듈

def sorted_fun(list,asc=True,deepcopy=True):
    if deepcopy :
        import copy
        sorted_list = copy.copy(list)

    else :
        sorted_list = list


    for i in range(len(sorted_list)-1) :
        min_idx = i

        for j in range(i+1,len(sorted_list)) :
            if asc:
                if sorted_list[j] < sorted_list[min_idx] :
                    sorted_list[j], sorted_list[min_idx] = sorted_list[min_idx], sorted_list[j]
            else :
                if sorted_list[j] > sorted_list[min_idx] :
                    sorted_list[j], sorted_list[min_idx] = sorted_list[min_idx], sorted_list[j]
        print(f'sorting list : {sorted_list}')

    return sorted_list
#실행파일

import random

nums = random.sample(range(1,21),10)
print(f'not sorted nums : {nums}')

import select

asc = select.sorted_fun(nums,True)
print(f'sorted nums by asc : {asc}')

desc = select.sorted_fun(nums,False)
print(f'sorted nums by desc : {desc}')

Zero Base 데이터분석 스쿨
Daily Study Note
profile
Study Log

0개의 댓글