• Home
  • About
    • Ki Beom Kwon photo

      Ki Beom Kwon

      luvoatiger's tech blog

    • Learn More
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

기본 정렬 알고리즘

19 Feb 2022

Reading time ~2 minutes

개요

  • 코딩 테스트의 가장 기초적인 정렬 알고리즘을 구현해보고, 정리해두는 페이지

1. 버블 정렬

  • 코드
def bubble_sort(input_data):
    """
	인접한 값끼리 비교하면서, 순서가 정렬되지 않은 경우 정렬하는 방식을 반복한다.
	turn을 돌면서 가장 큰 원소가 제일 끝 부분으로 이동하게 된다.
	인접한 값끼리 비교하며 이동하는 모습을 거품(bubble)이 터지는 것처럼 보여 버블 정렬 이름이 붙었다.
	최악의 경우에는 len(input_data) * (len(input_data) - 1) / 2 번의 swap연산을 해야 하므로, O(N^2)의 시간복잡도를 가진다.
    """
    for turn in range(len(input_data) - 1):
        need_swap = False
        for index in range(len(input_data) - turn - 1):
            if input_data[index] > input_data[index + 1]:
                input_data[index], input_data[index + 1] = input_data[index + 1], input_data[index]
                need_swap=True

        if need_swap is False:
            break

    return input_data

2. 삽입 정렬

  • 코드
def insertion_sort(input_data):
    """
    두 번째 인덱스에 있는 원소부터 마지막 인덱스에 있는 원소를 대상으로
    그 앞 쪽에 있는 원소들 중 자신보다 작은 원소를 발견할 때까지 크기를 비교한 다음
    기존에 해당 인덱스에 있는 원소부터 앞쪽에 있는 원소들과 자신을 swap한다.

    최악의 경우에는 input_data * (input_data - 1) / 2 번의 swap연산을 해야 하므로, O(N^2)의 시간복잡도를 가진다.
    """
    for turn in range(len(input_data) - 1):
        for inner in range(turn + 1, 0, -1):
            if input_data[inner] < input_data[inner - 1]:
                input_data[inner], input_data[inner - 1] = input_data[inner - 1], input_data[inner]

    return input_data

3. 선택 정렬

  • 코드
def selection_sort(input_data):
    """
    주어진 데이터 중 최솟값을 찾고, 해당 최솟값을 맨 앞의 값과 교체한다.
    이를 나머지 원소들에 대해서도 반복한다.

    최악의 경우에는 input_data * (input_data - 1) / 2 번의 swap연산을 해야 하므로, O(N^2)의 시간복잡도를 가진다.
    """
    for turn in range(len(input_data) - 1):
        min_value = input_data[turn]
        for inner in range(turn + 1, len(input_data)):
            if input_data[inner] < min_value:
                min_value = input_data[inner]
        input_data[turn], min_value = min_value, input_data[turn]

    return input_data

4. 실행 및 테스트

  • 실행 및 테스트 코드
import random
import pytest
def execute_sorting_function(sort_func, input_data):
    """
    정렬 함수와 데이터를 입력받아, 정렬
    """
    return sort_func(input_data)

def test_execute_sorting_function():
    """
    정렬 테스트 코드
    0 ~ 100 사이의 값 50개를 뽑아서, 직접 작성한 메서드의 수행 결과와 내장 함수 sorted의 실행 결과를 비교함
    """
    input_data = list(random.sample(range(100), 50))
    return_data = execute_sorting_function(selection_sort, input_data)
    sorted_data = sorted(input_data)
    assert return_data == sorted_data
  • 실행 커맨드 및 결과
실행 커맨드(해당 파이썬 파일의 이름은 sorting.py)
pytest sorting.py

결과

C:\Users\kwonk>pytest sorting.py
================================================= test session starts =================================================
platform win32 -- Python 3.8.8, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: C:\Users\kwonk
plugins: anyio-3.3.4
collected 1 item

sorting.py .                                                                                                     [100%]

================================================== warnings summary ===================================================
Anaconda3\lib\site-packages\pyreadline\py3k_compat.py:8
  C:\Users\kwonk\Anaconda3\lib\site-packages\pyreadline\py3k_compat.py:8: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working
    return isinstance(x, collections.Callable)

-- Docs: https://docs.pytest.org/en/stable/warnings.html
============================================ 1 passed, 1 warning in 0.04s =============================================


Algorithms Share Tweet +1