From 5e24cfd8ebf66661c4f41bc42910488286a28644 Mon Sep 17 00:00:00 2001 From: MarineJoker Date: Wed, 11 Nov 2020 16:45:13 +0800 Subject: [PATCH 1/2] add quick sort algorithm with Lomuto partition --- sorts/quick_sort_3_partition.py | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/sorts/quick_sort_3_partition.py b/sorts/quick_sort_3_partition.py index 18c6e0f876d2..3fd3fa29e1a1 100644 --- a/sorts/quick_sort_3_partition.py +++ b/sorts/quick_sort_3_partition.py @@ -18,6 +18,53 @@ def quick_sort_3partition(sorting: list, left: int, right: int) -> None: quick_sort_3partition(sorting, b + 1, right) +def quick_sort_lomuto_partition(sorting: list, left: int, right: int) -> None: + """ + A pure Python implementation of quick sort algorithm(in-place) + with Lomuto partition scheme: + https://en.wikipedia.org/wiki/Quicksort#Lomuto_partition_scheme + + :param sorting: sort list + :param left: left endpoint of sorting + :param right: right endpoint of sorting + :return: None + + Examples: + >>> nums1 = [0, 5, 3, 1, 2] + >>> quick_sort_lomuto_partition(nums1, 0, 4) + >>> nums1 + [0, 1, 2, 3, 5] + >>> nums2 = [] + >>> quick_sort_lomuto_partition(nums2, 0, 0) + >>> nums2 + [] + >>> nums3 = [-2, 5, 0, -4] + >>> quick_sort_lomuto_partition(nums3, 0, 3) + >>> nums3 + [-4, -2, 0, 5] + """ + if left < right: + pivot_index = lomuto_partition(sorting, left, right) + quick_sort_lomuto_partition(sorting, left, pivot_index - 1) + quick_sort_lomuto_partition(sorting, pivot_index + 1, right) + + +def lomuto_partition(sorting: list, left: int, right: int) -> int: + """ + Example: + >>> lomuto_partition([1,5,7,6], 0, 3) + 2 + """ + pivot = sorting[right] + storeIndex = left + for i in range(left, right): + if sorting[i] < pivot: + sorting[storeIndex], sorting[i] = sorting[i], sorting[storeIndex] + storeIndex += 1 + sorting[right], sorting[storeIndex] = sorting[storeIndex], sorting[right] + return storeIndex + + def three_way_radix_quicksort(sorting: list) -> list: """ Three-way radix quicksort: From c5efd528af1eeba881fd4c64384fb978a12f16be Mon Sep 17 00:00:00 2001 From: MarineJoker Date: Sun, 27 Dec 2020 11:23:18 +0800 Subject: [PATCH 2/2] fix(lomuto_partition): fix snake_case --- sorts/quick_sort_3_partition.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sorts/quick_sort_3_partition.py b/sorts/quick_sort_3_partition.py index 3fd3fa29e1a1..1a6db6a364f0 100644 --- a/sorts/quick_sort_3_partition.py +++ b/sorts/quick_sort_3_partition.py @@ -56,13 +56,13 @@ def lomuto_partition(sorting: list, left: int, right: int) -> int: 2 """ pivot = sorting[right] - storeIndex = left + store_index = left for i in range(left, right): if sorting[i] < pivot: - sorting[storeIndex], sorting[i] = sorting[i], sorting[storeIndex] - storeIndex += 1 - sorting[right], sorting[storeIndex] = sorting[storeIndex], sorting[right] - return storeIndex + sorting[store_index], sorting[i] = sorting[i], sorting[store_index] + store_index += 1 + sorting[right], sorting[store_index] = sorting[store_index], sorting[right] + return store_index def three_way_radix_quicksort(sorting: list) -> list: