[Python 알고리즘] # 정렬 알고리즘

김나연·2021년 9월 14일
1

Python

목록 보기
14/18
post-thumbnail

- Bubble Sort (버블 정렬)

이웃한 두 값을 비교하여 모든 원소를 swap하는 작업을 반복하며 O(n^2)의 시간복잡도를 갖는다.

def swap(x, i, j):
    x[i], x[j] = x[j], x[i]

def bubbleSort(x):
    for size in reversed(range(len(x))):
        for i in range(size):
            if x[i] > x[i+1]:
                swap(x, i, i+1)

- Selection Sort(선택정렬)

각 회전마다 가장 작은 값을 찾아서 이를 맨 앞과 교환하는 방식을 가지고 있다.

앞에서부터 정렬해나가는 특성을 가지고 있으며 O(n^2) 시간복잡도를 가진다.

def swap(x, i, j):
    x[i], x[j] = x[j], x[i]

def selectionSort(x):
    for size in reversed(range(len(x))):
        max_i = 0
        for i in range(1, 1+size):
            if x[i] > x[max_i]:
                max_i = i
        swap(x, max_i, size)

- Insertion Sort (삽입정렬)

정렬되지 않은 값을 정렬된 배열 사이 올바른 자리에 데이터를 삽입하는 방식이다.

데이터의 양이 많아질수록 효율이 떨어지며 O(n^2) 시간복잡도를 갖는다.

def insertionSort(x):
    for size in range(1, len(x)):
        val = x[size]
        i = size
        while i > 0 and x[i-1] > val:
            x[i] = x[i-1]
            i -= 1
        x[i] = val

- Merge Sort (병합 정렬)

두 부분으로 분할하는 과정을 재귀적으로 반복하고 작은 값부터 병합하는 분할 정복 알고리즘의 일종이다.

반으로 쪼개고 다시 합치는 과정에서 그룹을 만들어 정렬하므로 2n개의 공간이 필요하고 O(n log n)의 시간복잡도를 갖는다.

def mergeSort(x):
    if len(x) > 1:
        mid = len(x)//2
        lx, rx = x[:mid], x[mid:]
        mergeSort(lx)
        mergeSort(rx)

        li, ri, i = 0, 0, 0
        while li < len(lx) and ri < len(rx):
            if lx[li] < rx[ri]:
                x[i] = lx[li]
                li += 1
            else:
                x[i] = rx[ri]
                ri += 1
            i += 1
        x[i:] = lx[li:] if li != len(lx) else rx[ri:]

- Quick Sort (퀵 정렬)

병합 정렬과 마찬가지로 분할 정복 알고리즘의 일종이지만 추가적인 메모리 공간이 필요 없다.

Pivot(기준값)을 정하여 Pivot보다 작은 값은 앞으로, 큰 값을 뒤로 오도록 정렬하며 O(n log n) 시간복잡도를 갖는다.

import random

a = random.sample(range(1, 10), 5) 
print(a) 
print('')
def quickSort(a, start, end):
    
    if start < end: 
        left = start 
        pivot = a[end] 
        for i in range(start, end): 
            if a[i] < pivot: 
                a[i], a[left] = a[left], a[i] 
                left += 1 
        a[left] , a[end] = a[end], a[left] 
        print(left)
        quickSort(a, start, left-1) 
        quickSort(a, left+1, end) 
quickSort(a, 0, len(a)-1)
print('')
print(a)

- 내장 정렬 메소드

특별한 경우가 아니라면 내장함수 sort를 통해 정렬을 할 수 있다.

import random
a = random.sample(range(1, 10), 5)

print(a.sort())
profile
결국 무엇이든 해내는 사람 '김나연'입니다. 😎

0개의 댓글