mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-02-17 06:48:09 +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 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)
|
* [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)
|
* [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)
|
* [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)
|
* [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)
|
* [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