Computer Science/알고리즘 ( Algorithm )

Quicksort 변형

bugtype 2020. 2. 29. 13:22

quick sort는 pivot(기준점)을 정한 뒤에 작은 영역(smaller partition), 큰 영역(bigger partition)을 나누는 작업을 반복하는 것이다.

 

가독성 좋고 편한 quik sort 코드이다. 단점으로는 메모리를 이용한다는 것이다.

 

- 메모리 이용

def sort(array=[12,4,5,6,7,3,1,15]):
    """Sort the array by using quicksort."""

    less = []
    equal = []
    greater = []

    if len(array) > 1:
        pivot = array[0]
        for x in array:
            if x < pivot:
                less.append(x)
            elif x == pivot:
                equal.append(x)
            elif x > pivot:
                greater.append(x)
        return sort(less)+equal+sort(greater)
    else: 
        return array



print(sort([2,2,6,0,10]))

 

q=lambda x:x and q([i for i in x[1:]if i<=x[0]])+[x[0]]+q([i for i in x[1:]if i>x[0]])


- 정식

def quicksort(a_list):
    """Hoare partition scheme, see https://en.wikipedia.org/wiki/Quicksort"""
    def _quicksort(a_list, low, high):
        # must run partition on sections with 2 elements or more
        if low < high: 
            p = partition(a_list, low, high)
            _quicksort(a_list, low, p)
            _quicksort(a_list, p+1, high)
    def partition(a_list, low, high):
        pivot = a_list[low]
        while True:
            while a_list[low] < pivot:
                low += 1
            while a_list[high] > pivot:
                high -= 1
            if low >= high:
                return high
            a_list[low], a_list[high] = a_list[high], a_list[low]
            low += 1
            high -= 1
    _quicksort(a_list, 0, len(a_list)-1)
    return a_list

 

참고

- https://www.youtube.com/watch?v=7BDzle2n47c

- https://stackoverflow.com/questions/18262306/quicksort-with-python

'Computer Science > 알고리즘 ( Algorithm )' 카테고리의 다른 글

중복 검사 - Floyd's Algorithm  (0) 2020.03.04
python 2d array 회전  (0) 2020.02.23
피보나치 수열 - 황금비율 문제  (0) 2020.02.22
프로그래머스 - 탑 문제 풀기  (0) 2019.10.12
K번째 수  (0) 2019.10.06