From 9e5f365fed73cd968b5488866be2bb6e22b5ca21 Mon Sep 17 00:00:00 2001 From: Arvind Krishna <54891738+ArvindAROO@users.noreply.github.com> Date: Fri, 8 May 2020 01:14:34 +0530 Subject: [PATCH] Add sleep-sort (#1867) * added sleepsort Adding sleepsort * Add doctest and typing for sleepsort * Use self-descriptive variable name * Update sleepsort.py * Update sorts/sleepsort.py Co-authored-by: John Law Co-authored-by: Christian Clauss --- sorts/sleepsort.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 sorts/sleepsort.py diff --git a/sorts/sleepsort.py b/sorts/sleepsort.py new file mode 100644 index 000000000..5fa688d1b --- /dev/null +++ b/sorts/sleepsort.py @@ -0,0 +1,48 @@ +"""Sleepsort is probably the wierdest of all sorting functions +with time-complexity of O(max(input)+n) which is +quite different from almost all other sorting techniques. +If the number of inputs is small then the complexity +can be approximated to be O(max(input)) which is a constant + +If the number of inputs is large, the complexity is +approximately O(n). + +This function uses multithreading a kind of higher order programming +and calls n functions, each with a sleep time equal to its number. +Hence each of the functions wake in sorted form. + +This function is not stable for very large values. + +https://rosettacode.org/wiki/Sorting_algorithms/Sleep_sort +""" + +from time import sleep +from threading import Timer +from typing import List + + +def sleepsort(values: List[int]) -> List[int]: + """ + Sort the list using sleepsort. + >>> sleepsort([3, 2, 4, 7, 3, 6, 9, 1]) + [1, 2, 3, 3, 4, 6, 7, 9] + >>> sleepsort([3, 2, 1, 9, 8, 4, 2]) + [1, 2, 2, 3, 4, 8, 9] + """ + sleepsort.result = [] + def append_to_result(x): + sleepsort.result.append(x) + mx = values[0] + for v in values: + if mx < v: + mx = v + Timer(v, append_to_result, [v]).start() + sleep(mx+1) + return sleepsort.result + +if __name__ == '__main__': + import doctest + doctest.testmod() + x = [3, 2, 4, 7, 3, 6, 9, 1] + sorted_x = sleepsort(x) + print(sorted_x)