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)