복붙노트

[PYTHON] 파이썬으로 Quicksort

PYTHON

파이썬으로 Quicksort

나는 파이썬에 완전히 익숙하지 않다. 그리고 나는 그것에 퀵 소트를 구현하려하고있다. 누군가 제 코드 작성을 도와 주시겠습니까?

3 개의 배열을 연결하여 인쇄하는 방법을 모르겠습니다.

def sort(array=[12,4,5,6,7,3,1,15]):
    less = []
    equal = []
    greater = []

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

해결법

  1. ==============================

    1.

    def sort(array=[12,4,5,6,7,3,1,15]):
        less = []
        equal = []
        greater = []
    
        if len(array) > 1:
            pivot = array[0]
            for x in array:
                if x < pivot:
                    less.append(x)
                if x == pivot:
                    equal.append(x)
                if x > pivot:
                    greater.append(x)
            # Don't forget to return something!
            return sort(less)+equal+sort(greater)  # Just use the + operator to join lists
        # Note that you want equal ^^^^^ not pivot
        else:  # You need to hande the part at the end of the recursion - when you only have one element in your array, just return the array.
            return array
    
  2. ==============================

    2.추가 메모리가없는 빠른 정렬 (자리 표시)

    추가 메모리가없는 빠른 정렬 (자리 표시)

    용법:

    array = [97, 200, 100, 101, 211, 107]
    quicksort(array)
    # array -> [97, 100, 101, 107, 200, 211]
    
    def partition(array, begin, end):
        pivot = begin
        for i in xrange(begin+1, end+1):
            if array[i] <= array[begin]:
                pivot += 1
                array[i], array[pivot] = array[pivot], array[i]
        array[pivot], array[begin] = array[begin], array[pivot]
        return pivot
    
    
    
    def quicksort(array, begin=0, end=None):
        if end is None:
            end = len(array) - 1
        def _quicksort(array, begin, end):
            if begin >= end:
                return
            pivot = partition(array, begin, end)
            _quicksort(array, begin, pivot-1)
            _quicksort(array, pivot+1, end)
        return _quicksort(array, begin, end)
    
  3. ==============================

    3.또 다른 간결하고 아름다운 버전이 있습니다.

    또 다른 간결하고 아름다운 버전이 있습니다.

    def qsort(arr): 
         if len(arr) <= 1:
              return arr
         else:
              return qsort([x for x in arr[1:] if x<arr[0]]) + [arr[0]] + qsort([x for x in arr[1:] if x>=arr[0]])
    
    # this comment is just to improve readability due to horizontal scroll!!!
    

    자세한 내용은 위의 코드를 설명하겠습니다.

  4. ==============================

    4.Google에서 "python quicksort implementation"을 검색하면이 질문이 가장 먼저 나타납니다. 나는 초기 문제가 "코드 수정에 도움이되었다"는 것을 이해하지만, 이미 그 요청을 무시한 많은 해답이있다. 현재 두 번째로 찬성표를 던진 하나의 맹목적 인 "You are fired"의견을 가진 끔찍한 한 줄짜리 주석이며 일반적으로 (즉, 입력 목록 크기에 비례하여 추가 메모리를 사용하는) 많은 구현이 필요합니다. 이 대답은 in-place 솔루션을 제공하지만 python 2.x를위한 것입니다. 그래서, 아래는 Rosetta Code의 in-place 솔루션에 대한 나의 해석을 따르며, Python 3에서도 잘 작동합니다.

    Google에서 "python quicksort implementation"을 검색하면이 질문이 가장 먼저 나타납니다. 나는 초기 문제가 "코드 수정에 도움이되었다"는 것을 이해하지만, 이미 그 요청을 무시한 많은 해답이있다. 현재 두 번째로 찬성표를 던진 하나의 맹목적 인 "You are fired"의견을 가진 끔찍한 한 줄짜리 주석이며 일반적으로 (즉, 입력 목록 크기에 비례하여 추가 메모리를 사용하는) 많은 구현이 필요합니다. 이 대답은 in-place 솔루션을 제공하지만 python 2.x를위한 것입니다. 그래서, 아래는 Rosetta Code의 in-place 솔루션에 대한 나의 해석을 따르며, Python 3에서도 잘 작동합니다.

    import random
    
    def qsort(l, fst, lst):
        if fst >= lst: return
    
        i, j = fst, lst
        pivot = l[random.randint(fst, lst)]
    
        while i <= j:
            while l[i] < pivot: i += 1
            while l[j] > pivot: j -= 1
            if i <= j:
                l[i], l[j] = l[j], l[i]
                i, j = i + 1, j - 1
        qsort(l, fst, j)
        qsort(l, i, lst)
    

    그리고 내부 속성을 버릴 용의가 있다면 아래는 quicksort의 기본 아이디어를 잘 보여주는 또 다른 버전입니다. 가독성을 제외하고는 다른 장점은 안정적이라는 것입니다 (동일한 요소는 정렬되지 않은 목록에 있던 것과 동일한 순서로 정렬 된 목록에 나타납니다). 이 안정성 속성은 위에 제시된 메모리 부족 배타적 인 내부 구현에서 유지되지 않습니다.

    def qsort(l):
        if not l: return l # empty sequence case
        pivot = l[random.choice(range(0, len(l)))]
    
        head = qsort([elem for elem in l if elem < pivot])
        tail = qsort([elem for elem in l if elem > pivot])
        return head + [elem for elem in l if elem == pivot] + tail
    
  5. ==============================

    5.이미 이것에 대한 해답이 많이 있지만이 방법이 가장 깨끗한 구현이라고 생각합니다.

    이미 이것에 대한 해답이 많이 있지만이 방법이 가장 깨끗한 구현이라고 생각합니다.

    def quicksort(arr):
        """ Quicksort a list
    
        :type arr: list
        :param arr: List to sort
        :returns: list -- Sorted list
        """
        if not arr:
            return []
    
        pivots = [x for x in arr if x == arr[0]]
        lesser = quicksort([x for x in arr if x < arr[0]])
        greater = quicksort([x for x in arr if x > arr[0]])
    
        return lesser + pivots + greater
    

    물론 변수를 모두 저장하는 것을 건너 뛰고 다음과 같이 바로 반환 할 수 있습니다.

    def quicksort(arr):
        """ Quicksort a list
    
        :type arr: list
        :param arr: List to sort
        :returns: list -- Sorted list
        """
        if not arr:
            return []
    
        return quicksort([x for x in arr if x < arr[0]]) \
            + [x for x in arr if x == arr[0]] \
            + quicksort([x for x in arr if x > arr[0]])
    
  6. ==============================

    6.실생활에서 우리는 항상 파이썬이 제공하는 내장 된 정렬을 사용해야합니다. 그러나 퀵 정렬 알고리즘을 이해하는 것은 도움이됩니다.

    실생활에서 우리는 항상 파이썬이 제공하는 내장 된 정렬을 사용해야합니다. 그러나 퀵 정렬 알고리즘을 이해하는 것은 도움이됩니다.

    내 목표는 참조 자료로 돌아 가지 않고도 독자가 쉽게 이해하고 복제 할 수 있도록 주제를 분류하는 것입니다.

    퀵 소트 알고리즘은 본질적으로 다음과 같습니다.

    데이터가 무작위로 분포하는 경우 첫 번째 데이터 요소를 피벗으로 선택하면 임의 선택이됩니다.

    먼저 주석과 변수 이름을 사용하여 중간 값을 가리키는 읽기 가능한 예제를 살펴 보겠습니다.

    def quicksort(xs):
        """Given indexable and slicable iterable, return a sorted list"""
        if xs: # if given list (or tuple) with one ordered item or more: 
            pivot = xs[0]
            # below will be less than:
            below = [i for i in xs[1:] if i < pivot] 
            # above will be greater than or equal to:
            above = [i for i in xs[1:] if i >= pivot]
            return quicksort(below) + [pivot] + quicksort(above)
        else: 
            return xs # empty list
    

    여기에 설명 된 알고리즘과 코드를 다시 설명하기 위해 피벗 위의 값을 오른쪽으로 이동하고 피벗 아래의 값을 왼쪽으로 이동 한 다음 해당 파티션을 동일한 함수로 전달하여 추가 정렬합니다.

    이것은 88 개의 문자로 골프 될 수 있습니다 :

    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(xs):
        if xs: 
            below = [i for i in xs[1:] if i < xs[0]] 
            above = [i for i in xs[1:] if i >= xs[0]]
            return quicksort(below) + [xs[0]] + quicksort(above)
        else: 
            return xs
    

    이제 아래에서 위의 위치에서 찾을 수 있습니다.

    def quicksort(xs):
        if xs: 
            return (quicksort([i for i in xs[1:] if i < xs[0]] )
                    + [xs[0]] 
                    + quicksort([i for i in xs[1:] if i >= xs[0]]))
        else: 
            return xs
    

    이제 그 사실을 알고 false라면 이전 요소를 반환하고, 그렇지 않으면 다음 요소를 평가하여 반환합니다.

    def quicksort(xs):
        return xs and (quicksort([i for i in xs[1:] if i < xs[0]] )
                       + [xs[0]] 
                       + quicksort([i for i in xs[1:] if i >= xs[0]]))
    

    lambdas는 하나의 표현식을 반환하기 때문에 하나의 표현식으로 단순화했습니다 (읽을 수 없게되었지만). 이제는 람다를 사용할 수 있습니다.

    quicksort = lambda xs: (quicksort([i for i in xs[1:] if i < xs[0]] )
                            + [xs[0]] 
                            + quicksort([i for i in xs[1:] if i >= xs[0]]))
    

    그리고 예제로 줄이기 위해 함수와 변수 이름을 하나의 문자로 줄이고 필요하지 않은 공백을 제거하십시오.

    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]])
    

    대부분의 코드 골프와 마찬가지로이 람다는 다소 나쁜 스타일입니다.

    이전 구현은 불필요한 추가 목록을 많이 만듭니다. 우리가 이것을 제자리에서 할 수 있다면 공간 낭비를 피할 수 있습니다.

    아래의 구현은 위키 백과에서 더 자세히 읽을 수있는 Hoare 분할 스키마를 사용합니다 (그러나 do-while 대신 while 루프 구문을 사용하고 partitioning () 호출로 네 번까지 중복 계산을 제거했습니다. 외부 while 루프의 끝).

    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
    

    내가 충분히 철저히 테스트했는지 확실하지 않다.

    def main():
        assert quicksort([1]) == [1]
        assert quicksort([1,2]) == [1,2]
        assert quicksort([1,2,3]) == [1,2,3]
        assert quicksort([1,2,3,4]) == [1,2,3,4]
        assert quicksort([2,1,3,4]) == [1,2,3,4]
        assert quicksort([1,3,2,4]) == [1,2,3,4]
        assert quicksort([1,2,4,3]) == [1,2,3,4]
        assert quicksort([2,1,1,1]) == [1,1,1,2]
        assert quicksort([1,2,1,1]) == [1,1,1,2]
        assert quicksort([1,1,2,1]) == [1,1,1,2]
        assert quicksort([1,1,1,2]) == [1,1,1,2]
    

    이 알고리즘은 컴퓨터 과학 과정에서 자주 가르치고 구직 면접을 요구합니다. 그것은 우리가 재귀와 분단을 생각하는 데 도움이됩니다.

    Quicksort는 우리의 내장 시간 소트 알고리즘이 매우 효율적이고 재귀 한계가 있기 때문에 파이썬에서는 그다지 실용적이지 않습니다. list.sort를 사용하여 목록을 현재 위치에서 정렬하거나 정렬 된 새 정렬 목록을 만들 것을 기대합니다. 둘 다 키와 반대 인수를 사용합니다.

  7. ==============================

    7.기능적 접근 :

    기능적 접근 :

    def qsort(list):
        if len(list) < 2:
            return list
    
        pivot = list.pop()
        left = filter(lambda x: x <= pivot, list)
        right = filter(lambda x: x > pivot, list)
    
        return qsort(left) + [pivot] + qsort(right)
    
  8. ==============================

    8.기능적 프로그래밍 접근법

    기능적 프로그래밍 접근법

    smaller = lambda xs, y: filter(lambda x: x <= y, xs)
    larger = lambda xs, y: filter(lambda x: x > y, xs)
    qsort = lambda xs: qsort(smaller(xs[1:],xs[0])) + [xs[0]] + qsort(larger(xs[1:],xs[0])) if xs != [] else []
    
    print qsort([3,1,4,2,5]) == [1,2,3,4,5]
    
  9. ==============================

    9.둘 다 여기에 답변을 원래의 질문에 대한 답변을 제공 한 목록에 대한 확인 작동하지만 생각한다면 고유 한 값이 아닌 배열을 전달하는 경우 중단됩니다. 그래서 완벽을 기하기 위해 각각의 작은 오류를 지적하고 오류를 수정하는 방법을 설명합니다.

    둘 다 여기에 답변을 원래의 질문에 대한 답변을 제공 한 목록에 대한 확인 작동하지만 생각한다면 고유 한 값이 아닌 배열을 전달하는 경우 중단됩니다. 그래서 완벽을 기하기 위해 각각의 작은 오류를 지적하고 오류를 수정하는 방법을 설명합니다.

    예를 들어 Brionius 알고리즘으로 다음 배열 [12,4,5,6,7,3,1,15,1] (1이 두 번 나타남)을 정렬하려고합니다. 어떤 시점에서는 더 적은 배열이 비어있게됩니다. 그리고 다음 반복과 len ()> 1에서 분리 할 수없는 값 쌍 (1,1)을 가진 등호 배열 ... 따라서 무한 루프로 끝날 것입니다

    less가 비어있는 경우 배열을 반환하거나 zangw 대답처럼 같은 배열에서 sort를 호출하지 않는 것이 좋습니다.

    def sort(array=[12,4,5,6,7,3,1,15]):
        less = []
        equal = []
        greater = []
    
        if len(array) > 1:
            pivot = array[0]
            for x in array:
                if x < pivot:
                    less.append(x)
                if x == pivot:
                    equal.append(x)
                if x > pivot:
                    greater.append(x)
    
            # Don't forget to return something!
            return sort(less)+ equal +sort(greater)  # Just use the + operator to join lists
        # Note that you want equal ^^^^^ not pivot
        else:  # You need to hande the part at the end of the recursion - when you only have one element in your array, just return the array.
            return array
    

    더 멋진 솔루션도 중단되지만 다른 원인으로 인해 재귀 라인의 return 절이 누락되어 어느 시점에 None을 반환하고 목록에 추가하려고합니다.

    그것을 고치려면 그 라인에 리턴을 추가하십시오.

    def qsort(arr): 
       if len(arr) <= 1:
          return arr
       else:
          return qsort([x for x in arr[1:] if x<arr[0]]) + [arr[0]] + qsort([x for x in arr[1:] if x>=arr[0]])
    
  10. ==============================

    10.

    def quick_sort(array):
        return quick_sort([x for x in array[1:] if x < array[0]]) + [array[0]] \
            + quick_sort([x for x in array[1:] if x >= array[0]]) if array else []
    
  11. ==============================

    11.

    def Partition(A,p,q):
        i=p
        x=A[i]
        for j in range(p+1,q+1):
            if A[j]<=x:
                i=i+1
                tmp=A[j]
                A[j]=A[i]
                A[i]=tmp
        l=A[p]
        A[p]=A[i]
        A[i]=l
        return i
    
    def quickSort(A,p,q):
        if p<q:
            r=Partition(A,p,q)
            quickSort(A,p,r-1)
            quickSort(A,r+1,q)
        return A
    
  12. ==============================

    12."실제"내부 구현 [Algorithm 8.9, 8.11, Michael T. Goodrich 및 Roberto Tamassia의 알고리즘 설계 및 응용 프로그램 북]

    "실제"내부 구현 [Algorithm 8.9, 8.11, Michael T. Goodrich 및 Roberto Tamassia의 알고리즘 설계 및 응용 프로그램 북]

    from random import randint
    
    def partition (A, a, b):
        p = randint(a,b)
        # or mid point
        # p = (a + b) / 2
    
        piv = A[p]
    
        # swap the pivot with the end of the array
        A[p] = A[b]
        A[b] = piv
    
        i = a     # left index (right movement ->)
        j = b - 1 # right index (left movement <-)
    
        while i <= j:
            # move right if smaller/eq than/to piv
            while A[i] <= piv and i <= j:
                i += 1
            # move left if greater/eq than/to piv
            while A[j] >= piv and j >= i:
                j -= 1
    
            # indices stopped moving:
            if i < j:
                # swap
                t = A[i]
                A[i] = A[j]
                A[j] = t
        # place pivot back in the right place
        # all values < pivot are to its left and 
        # all values > pivot are to its right
        A[b] = A[i]
        A[i] = piv
    
        return i
    
    def IpQuickSort (A, a, b):
    
        while a < b:
            p = partition(A, a, b) # p is pivot's location
    
            #sort the smaller partition
            if p - a < b - p:
                IpQuickSort(A,a,p-1)
                a = p + 1 # partition less than p is sorted
            else:
                IpQuickSort(A,p+1,b)
                b = p - 1 # partition greater than p is sorted
    
    
    def main():
        A =  [12,3,5,4,7,3,1,3]
        print A
        IpQuickSort(A,0,len(A)-1)
        print A
    
    if __name__ == "__main__": main()
    
  13. ==============================

    13.이 알고리즘은 다음과 같은 간단한 4 단계로 구성됩니다.

    이 알고리즘은 다음과 같은 간단한 4 단계로 구성됩니다.

    파이썬에서 알고리즘에 대한 코드 :

    def my_sort(A):
    
          p=A[0]                                       #determine pivot element. 
          left=[]                                      #create left array
          right=[]                                     #create right array
          for i in range(1,len(A)):
            #if cur elem is less than pivot, add elem in left array
            if A[i]< p:
              left.append(A[i])         
              #the recurssion will occur only if the left array is atleast half the size of original array
              if len(left)>1 and len(left)>=len(A)//2:          
                  left=my_sort(left)                            #recursive call
            elif A[i]>p: 
              right.append(A[i])                                #if elem is greater than pivot, append it to right array
              if len(right)>1 and len(right)>=len(A)//2:        # recurssion will occur only if length of right array is atleast the size of original array
                  right=my_sort(right)
         A=left+[p]+right                                        #append all three part of the array into one and return it
         return A
    
    my_sort([12,4,5,6,7,3,1,15])
    

    왼쪽과 오른쪽 부분으로이 알고리즘을 재귀 적으로 수행하십시오.

  14. ==============================

    14.버전 Python 3.x의 경우 : 주로 가독성을 높이기 위해 연산자 모듈을 사용하는 기능 스타일입니다.

    버전 Python 3.x의 경우 : 주로 가독성을 높이기 위해 연산자 모듈을 사용하는 기능 스타일입니다.

    from operator import ge as greater, lt as lesser
    
    def qsort(L): 
        if len(L) <= 1: return L
        pivot   = L[0]
        sublist = lambda op: [*filter(lambda num: op(num, pivot), L[1:])]
    
        return qsort(sublist(lesser))+ [pivot] + qsort(sublist(greater))
    

    다음과 같이 테스트됩니다.

    print (qsort([3,1,4,2,5]) == [1,2,3,4,5])
    
  15. ==============================

    15.

    def quick_sort(self, nums):
        def helper(arr):
            if len(arr) <= 1: return arr
            #lwall is the index of the first element euqal to pivot
            #rwall is the index of the first element greater than pivot
            #so arr[lwall:rwall] is exactly the middle part equal to pivot after one round
            lwall, rwall, pivot = 0, 0, 0
            #choose rightmost as pivot
            pivot = arr[-1]
            for i, e in enumerate(arr):
                if e < pivot:
                    #when element is less than pivot, shift the whole middle part to the right by 1
                    arr[i], arr[lwall] = arr[lwall], arr[i]
                    lwall += 1
                    arr[i], arr[rwall] = arr[rwall], arr[i]
                    rwall += 1
                elif e == pivot:
                    #when element equals to pivot, middle part should increase by 1
                    arr[i], arr[rwall] = arr[rwall], arr[i]
                    rwall += 1
                elif e > pivot: continue
            return helper(arr[:lwall]) + arr[lwall:rwall] + helper(arr[rwall:])
        return helper(nums)
    
  16. ==============================

    16.파티션 - 작은 요소가 왼쪽으로 이동하고 큰 elemets가 오른쪽으로 이동하거나 그 반대로 피벗을 사용하여 배열을 분할합니다. 피벗은 배열의 임의 요소 일 수 있습니다. 이 알고리즘을 만들기 위해서는 배열의 시작과 끝 인덱스가 무엇인지, 피벗 (pivot)이 어디인지 알아야합니다. 그런 다음 두 개의 보조 포인터 L, R을 설정하십시오.

    파티션 - 작은 요소가 왼쪽으로 이동하고 큰 elemets가 오른쪽으로 이동하거나 그 반대로 피벗을 사용하여 배열을 분할합니다. 피벗은 배열의 임의 요소 일 수 있습니다. 이 알고리즘을 만들기 위해서는 배열의 시작과 끝 인덱스가 무엇인지, 피벗 (pivot)이 어디인지 알아야합니다. 그런 다음 두 개의 보조 포인터 L, R을 설정하십시오.

    그래서 우리는 배열 사용자 [..., 시작, ..., 끝, ...]

    L 및 R 포인터의 시작 위치 [..., 시작, 다음, ..., 끝 ...] R L

    L 사용자 [L]을 누른 다음 R을 하나 이동하고 사용자 [R]을 사용자 [L] 2. L을 하나 옮긴다.

    사용자 [R]을 (를) 사용자 [피봇]과 바꾼 후,

    빠른 정렬 - 피벗에 의한 분할의 모든 다음 부분이 끝 인덱스보다 크거나 같을 때까지 파티션 알고리즘을 사용하십시오.

    def qsort(user, begin, end):
    
        if begin >= end:
            return
    
        # partition
        # pivot = begin
        L = begin+1
        R = begin
        while L < end:
            if user[begin] > user[L]:
                R+=1
                user[R], user[L] = user[L], user[R]
            L+= 1
        user[R], user[begin] = user[begin], user[R]
    
        qsort(user, 0, R)
        qsort(user, R+1, end)
    
    tests = [
        {'sample':[1],'answer':[1]},
        {'sample':[3,9],'answer':[3,9]},
        {'sample':[1,8,1],'answer':[1,1,8]},
        {'sample':[7,5,5,1],'answer':[1,5,5,7]},
        {'sample':[4,10,5,9,3],'answer':[3,4,5,9,10]},
        {'sample':[6,6,3,8,7,7],'answer':[3,6,6,7,7,8]},
        {'sample':[3,6,7,2,4,5,4],'answer':[2,3,4,4,5,6,7]},
        {'sample':[1,5,6,1,9,0,7,4],'answer':[0,1,1,4,5,6,7,9]},
        {'sample':[0,9,5,2,2,5,8,3,8],'answer':[0,2,2,3,5,5,8,8,9]},
        {'sample':[2,5,3,3,2,0,9,0,0,7],'answer':[0,0,0,2,2,3,3,5,7,9]}
    ]
    
    for test in tests:
    
        sample = test['sample'][:]
        answer = test['answer']
    
        qsort(sample,0,len(sample))
    
        print(sample == answer)
    
  17. ==============================

    17.또는 파이썬에서 C / C ++ varags, lambda 식 및 if 식과 동일한 기능을하는 1 개의 라이너를 선호하는 경우 :

    또는 파이썬에서 C / C ++ varags, lambda 식 및 if 식과 동일한 기능을하는 1 개의 라이너를 선호하는 경우 :

    qsort = lambda x=None, *xs: [] if x is None else qsort(*[a for a in xs if a<x]) + [x] + qsort(*[a for a in xs if a>=x])
    
  18. ==============================

    18.나는 아래 코드를 붙이고있다! 이 퀵 소트는 피벗 값의 위치 때문에 훌륭한 학습 도구입니다. 그것은 일정한 장소에 있기 때문에, 당신은 여러 번 걸을 수 있고 실제로 그것이 어떻게 작동하는지 잠깐 살펴볼 수 있습니다. 실제로는 O (N ^ 2) 런타임을 피하기 위해 피벗을 무작위로 추출하는 것이 가장 좋습니다.

    나는 아래 코드를 붙이고있다! 이 퀵 소트는 피벗 값의 위치 때문에 훌륭한 학습 도구입니다. 그것은 일정한 장소에 있기 때문에, 당신은 여러 번 걸을 수 있고 실제로 그것이 어떻게 작동하는지 잠깐 살펴볼 수 있습니다. 실제로는 O (N ^ 2) 런타임을 피하기 위해 피벗을 무작위로 추출하는 것이 가장 좋습니다.

    def quicksort10(alist):
        quicksort_helper10(alist, 0, len(alist)-1)
    
    def quicksort_helper10(alist, first, last):
        """  """
        if first < last:
            split_point = partition10(alist, first, last)
            quicksort_helper10(alist, first, split_point - 1)
            quicksort_helper10(alist, split_point + 1, last)
    
    def partition10(alist, first, last):
        done = False
        pivot_value = alist[first]
        leftmark = first + 1
        rightmark = last
        while not done:
            while leftmark <= rightmark and alist[leftmark] <= pivot_value:
                leftmark = leftmark + 1
            while leftmark <= rightmark and alist[rightmark] >= pivot_value:
                rightmark = rightmark - 1
    
            if leftmark > rightmark:
                done = True
            else:
                temp = alist[leftmark]
                alist[leftmark] = alist[rightmark]
                alist[rightmark] = temp
        temp = alist[first]
        alist[first] = alist[rightmark]
        alist[rightmark] = temp
        return rightmark
    
  19. ==============================

    19.

    def quick_sort(l):
        if len(l) == 0:
            return l
        pivot = l[0]
        pivots = [x for x in l if x == pivot]
        smaller = quick_sort([x for x in l if x < pivot])
        larger = quick_sort([x for x in l if x > pivot])
        return smaller + pivots + larger
    
  20. ==============================

    20.파티션 단계에서 인쇄 된 변수를 사용한 전체 예제 :

    파티션 단계에서 인쇄 된 변수를 사용한 전체 예제 :

    def partition(data, p, right):
        print("\n==> Enter partition: p={}, right={}".format(p, right))
        pivot = data[right]
        print("pivot = data[{}] = {}".format(right, pivot))
    
        i = p - 1  # this is a dangerous line
    
        for j in range(p, right):
            print("j: {}".format(j))
            if data[j] <= pivot:
                i = i + 1
                print("new i: {}".format(i))
                print("swap: {} <-> {}".format(data[i], data[j]))
                data[i], data[j] = data[j], data[i]
    
        print("swap2: {} <-> {}".format(data[i + 1], data[right]))
        data[i + 1], data[right] = data[right], data[i + 1]
        return i + 1
    
    
    def quick_sort(data, left, right):
        if left < right:
            pivot = partition(data, left, right)
            quick_sort(data, left, pivot - 1)
            quick_sort(data, pivot + 1, right)
    
    data = [2, 8, 7, 1, 3, 5, 6, 4]
    
    print("Input array: {}".format(data))
    quick_sort(data, 0, len(data) - 1)
    print("Output array: {}".format(data))
    
  21. ==============================

    21.또 다른 quicksort 구현 :

    또 다른 quicksort 구현 :

    # A = Array 
    # s = start index
    # e = end index
    # p = pivot index
    # g = greater than pivot boundary index
    
    def swap(A,i1,i2):
      A[i1], A[i2] = A[i2], A[i1]
    
    def partition(A,g,p):
        # O(n) - just one for loop that visits each element once
        for j in range(g,p):
          if A[j] <= A[p]:
            swap(A,j,g)
            g += 1
    
        swap(A,p,g)
        return g
    
    def _quicksort(A,s,e):
        # Base case - we are sorting an array of size 1
        if s >= e:
          return
    
        # Partition current array
        p = partition(A,s,e)
        _quicksort(A,s,p-1) # Left side of pivot
        _quicksort(A,p+1,e) # Right side of pivot
    
    # Wrapper function for the recursive one
    def quicksort(A):
        _quicksort(A,0,len(A)-1)
    
    A = [3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3,-1]
    
    print(A)
    quicksort(A)
    print(A)
    
  22. ==============================

    22.이것은 Hoare 파티션 방식을 사용하고 스왑 및 로컬 변수 수가 적은 퀵 소트의 버전입니다.

    이것은 Hoare 파티션 방식을 사용하고 스왑 및 로컬 변수 수가 적은 퀵 소트의 버전입니다.

    def quicksort(array):
        qsort(array, 0, len(array)-1)
    
    def qsort(A, lo, hi):
        if lo < hi:
            p = partition(A, lo, hi)
            qsort(A, lo, p)
            qsort(A, p + 1, hi)
    
    def partition(A, lo, hi):
        pivot = A[lo]
        i, j = lo-1, hi+1
        while True:
          i += 1
          j -= 1
          while(A[i] < pivot): i+= 1
          while(A[j] > pivot ): j-= 1
    
          if i >= j: 
              return j
    
          A[i], A[j] = A[j], A[i]
    
    
    test = [21, 4, 1, 3, 9, 20, 25, 6, 21, 14]
    print quicksort(test)
    
  23. ==============================

    23.다음은 쉬운 구현 방법입니다.

    다음은 쉬운 구현 방법입니다.

    def quicksort(array):
                if len(array) < 2:
                      return array
                else:
                      pivot= array[0]
                      less = [i for i in array[1:] if i <= pivot]
    
                      greater = [i for i in array[1:] if i > pivot]
    
                      return quicksort(less) + [pivot] + quicksort(greater)
    
    print(quicksort([10, 5, 2, 3]))
    
  24. ==============================

    24.

    def quick_sort(list):
        if len(list) ==0:
            return []
    
        return  quick_sort(filter( lambda item: item < list[0],list)) + [v for v in list if v==list[0] ]  +  quick_sort( filter( lambda item: item > list[0], list))
    
  25. ==============================

    25.

    def quicksort(items):
        if not len(items) > 1:
            return items
        items, pivot = partition(items)
        return quicksort(items[:pivot]) + [items[pivot]] + quicksort(items[pivot + 1:])
    
    
    def partition(items):
        i = 1
        pivot = 0
        for j in range(1, len(items)):
            if items[j] <= items[pivot]:
                items[i], items[j] = items[j], items[i]
                i += 1
        items[i - 1], items[pivot] = items[pivot], items[i - 1]
        return items, i - 1
    
  26. ==============================

    26.인레이 정렬

    인레이 정렬

    def qsort(a, b=0, e=None):
        # partitioning
        def part(a, start, end):
            p = start
            for i in xrange(start+1, end):
                if a[i] < a[p]:
                    a[i], a[p+1] = a[p+1], a[i]
                    a[p+1], a[p] = a[p], a[p+1]
                    p += 1
            return p
    
        if e is None:
            e = len(a)
        if e-b <= 1: return
    
        p = part(a, b, e)
        qsort(a, b, p)
        qsort(a, p+1, e)
    

    재귀없이 :

    deq = collections.deque()
    deq.append((b, e))
    while len(deq):
        el = deq.pop()
        if el[1] - el[0] > 1:
            p = part(a, el[0], el[1])
            deq.append((el[0], p))
            deq.append((p+1, el[1]))
    
  27. ==============================

    27.덜 동등한 세 가지 배열을 취한 다음 모든 것을 연결하는 대신 전통적인 개념 (분할 방법)을 시도해보십시오.

    덜 동등한 세 가지 배열을 취한 다음 모든 것을 연결하는 대신 전통적인 개념 (분할 방법)을 시도해보십시오.

    http://pythonplanet.blogspot.in/2015/08/quick-sort-using-traditional-partition.html

    이것은 inbuilt 함수를 사용하지 않고 있습니다.

    파티셔닝 기능 -

    def partitn(alist, left, right):  
     i=left  
     j=right  
     mid=(left+right)/2   
    
    pivot=alist[mid]  
    while i <= j:  
        while alist[i] < pivot:  
            i=i+1   
    
        while alist[j] > pivot:  
            j=j-1   
    
        if i <= j:  
            temp = alist[i]  
            alist[i] = alist[j]  
            alist[j] = temp  
            i = i + 1   
            j = j - 1   
    
  28. ==============================

    28.난 nums 라이브러리를 사용하여 quicksort 할 것입니다. 정말 유용한 라이브러리라고 생각합니다. 그들은 이미 빠른 정렬 방법을 구현했지만 사용자 정의 방법을 구현할 수도 있습니다.

    난 nums 라이브러리를 사용하여 quicksort 할 것입니다. 정말 유용한 라이브러리라고 생각합니다. 그들은 이미 빠른 정렬 방법을 구현했지만 사용자 정의 방법을 구현할 수도 있습니다.

    import numpy
    array = [3,4,8,1,2,13,28,11,99,76] #The array what we want to sort
    
    indexes = numpy.argsort( array , None, 'quicksort', None)
    index_list = list(indexes)
    
    temp_array = []
    
    for index in index_list:
        temp_array.append( array[index])
    
    array = temp_array
    
    print array #it will show sorted array
    
  29. from https://stackoverflow.com/questions/18262306/quicksort-with-python by cc-by-sa and MIT license