1 분 소요

퀵 정렬

file

피벗을 기준으로 피벗보다 작은 값은 왼쪽으로 큰 값은 오른쪽으로 이동 시킨다.

피벗보다 작은 값을 찾으면 피벗보다 큰 값과 자리를 바꾼다.

image

코드

def quick_sort(array, left, right):
    if left < right:
        mid = partition(array, left, right)
        quick_sort(array, left, mid - 1)
        quick_sort(array, mid + 1, right)

# 피벗 기준 작은 값은 왼쪽으로 큰 값은 오른쪽으로 분리해주는 함수
# 바뀐 피벗의 인덱스를 리턴


def partition(array, left, right):
    low = left + 1
    high = right
    pivot = array[left]

    while low <= high:
        while low <= right and array[low] <= pivot:
            low += 1
        while high >= left and array[high] > pivot:
            high -= 1
        # 피벗 기준 왼쪽에서 큰 값과 피벗 기준 오른쪽에서 작은 값의 위치 바꿈
        if low < high:
            array[low], array[high] = array[high], array[low]

    # low와 high 위치가 바뀐 경우 high와 pivot의 위치를 바꾼다.
    array[left], array[high] = array[high], array[left]

    return high

백준 2751 수 정렬하기 2

실패 코드

기존 퀵 정렬 공부했을 때의 코드를 사용

# 2751 수 정렬하기 2

import sys


def quick_sort(array, left, right):
    if left < right:
        mid = partition(array, left, right)
        quick_sort(array, left, mid - 1)
        quick_sort(array, mid + 1, right)


def partition(array, left, right):
    pivot = array[left]
    low = left + 1
    high = right

    while low <= high:
        while low <= right and array[low] <= pivot:
            low += 1
        while high >= left and array[high] > pivot:
            high -= 1

        if low < high:
            array[low], array[high] = array[high], array[low]

    array[high], array[left] = array[left], array[high]

    return high


input = sys.stdin.readline
n = int(input())
arr = []

for _ in range(n):
    arr.append(int(input()))
quick_sort(arr, 0, len(arr) - 1)

for i in arr:
    print(i)

하지만 기존에 sort()라는 파이썬 기존 내장 함수 자체도 퀵 정렬을 기반으로 만들어진 것이고, 내가 구현한 것보다 훨씬 빠르므로 sort() 사용

댓글남기기