mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
Add Patience Sort (#3469)
* Add Patience Sort * fix code for pre-commit * Fix params def * Adding new line at end of file * Remove Trailing Whitespace * Adding space between the methods of the Stack class * Removing Trailing Whitespace * Ordering Imports * Adding url patience sort Co-authored-by: jvnascimento <nascimento783@gmail.com>
This commit is contained in:
parent
4c92f8c0d0
commit
79d57552aa
|
@ -761,6 +761,7 @@
|
|||
* [Odd Even Transposition Parallel](https://github.com/TheAlgorithms/Python/blob/master/sorts/odd_even_transposition_parallel.py)
|
||||
* [Odd Even Transposition Single Threaded](https://github.com/TheAlgorithms/Python/blob/master/sorts/odd_even_transposition_single_threaded.py)
|
||||
* [Pancake Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/pancake_sort.py)
|
||||
* [Patience Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/patience_sort.py)
|
||||
* [Pigeon Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/pigeon_sort.py)
|
||||
* [Pigeonhole Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/pigeonhole_sort.py)
|
||||
* [Quick Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/quick_sort.py)
|
||||
|
|
64
sorts/patience_sort.py
Normal file
64
sorts/patience_sort.py
Normal file
|
@ -0,0 +1,64 @@
|
|||
from bisect import bisect_left
|
||||
from functools import total_ordering
|
||||
from heapq import merge
|
||||
|
||||
"""
|
||||
A pure Python implementation of the patience sort algorithm
|
||||
|
||||
For more information: https://en.wikipedia.org/wiki/Patience_sorting
|
||||
|
||||
This algorithm is based on the card game patience
|
||||
|
||||
For doctests run following command:
|
||||
python3 -m doctest -v patience_sort.py
|
||||
|
||||
For manual testing run:
|
||||
python3 patience_sort.py
|
||||
"""
|
||||
|
||||
|
||||
@total_ordering
|
||||
class Stack(list):
|
||||
def __lt__(self, other):
|
||||
return self[-1] < other[-1]
|
||||
|
||||
def __eq__(self, other):
|
||||
return self[-1] == other[-1]
|
||||
|
||||
|
||||
def patience_sort(collection: list) -> list:
|
||||
"""A pure implementation of quick sort algorithm in Python
|
||||
|
||||
:param collection: some mutable ordered collection with heterogeneous
|
||||
comparable items inside
|
||||
:return: the same collection ordered by ascending
|
||||
|
||||
Examples:
|
||||
>>> patience_sort([1, 9, 5, 21, 17, 6])
|
||||
[1, 5, 6, 9, 17, 21]
|
||||
|
||||
>>> patience_sort([])
|
||||
[]
|
||||
|
||||
>>> patience_sort([-3, -17, -48])
|
||||
[-48, -17, -3]
|
||||
"""
|
||||
stacks = []
|
||||
# sort into stacks
|
||||
for element in collection:
|
||||
new_stacks = Stack([element])
|
||||
i = bisect_left(stacks, new_stacks)
|
||||
if i != len(stacks):
|
||||
stacks[i].append(element)
|
||||
else:
|
||||
stacks.append(new_stacks)
|
||||
|
||||
# use a heap-based merge to merge stack efficiently
|
||||
collection[:] = merge(*[reversed(stack) for stack in stacks])
|
||||
return collection
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
user_input = input("Enter numbers separated by a comma:\n").strip()
|
||||
unsorted = [int(item) for item in user_input.split(",")]
|
||||
print(patience_sort(unsorted))
|
Loading…
Reference in New Issue
Block a user