diff --git a/goulag_sort/goulagsort.py b/goulag_sort/goulagsort.py index d5087a8..093fd40 100644 --- a/goulag_sort/goulagsort.py +++ b/goulag_sort/goulagsort.py @@ -1,81 +1,42 @@ -def send_to_goulag(input_list:list)-> list : - """Sorts a list of numbers using the unique "Goulag Sort" method. - - This algorithm processes a list of numbers through a distinctive iterative and - recursive procedure, inspired by the "Stalin Sort" concept. Here's how it operates: - - 1. **Iterative Filtering:** It iterates through the main list. If an element - is found to be greater than its subsequent element, the subsequent element - is moved to a temporary holding list (`temp`). The main list then continues - with the remaining elements. - - 2. **Recursive Processing of Held Items:** If the `temp` list contains more than - one item, the `send_to_goulag` algorithm recursively processes `temp`. This - filtering and holding process continues until the sub-list contains a single - item or becomes empty. - - 3. **Partial Re-insertion:** After the recursive calls (or if `temp` was empty/single-item), - the algorithm attempts to re-insert the elements from `temp` back into the main list. - This re-insertion is performed by finding a suitable position where the held item - is less than the current element in the main list, maintaining a partial order. - - 4. **Final Appending:** Any remaining elements in `temp` that were not re-inserted - into the middle of the list are then appended to the end of the main list. - - For a more detailed step-by-step explanation of the algorithm's flow, please refer to: - :ref:`goulag_sort_detailed_explanation`. - - Args: - input_list (list): The list of numbers to be processed and sorted. - This list will be modified **in-place**. - - Returns: - list: The list after being processed by the Goulag Sort algorithm. The result - is an ordered list. - - Examples: - >>> from goulag_sort import send_to_goulag - >>> my_list = [5, 2, 8, 1, 9, 4] - >>> send_to_goulag(my_list) - [1, 2, 4, 5, 8, 9] - - >>> empty_list = [] - >>> send_to_goulag(empty_list) - [] - """ +import copy - idx = 0 - temp = [] - while True: +def send_to_goulag(main_list:list)->list: + if not main_list: + return main_list + itens_to_be_reinserted = [] - if not input_list: - return [] + main_list_copy = copy.deepcopy(main_list) + i = 0 + while i < len(main_list) - 1: + if main_list[i] > main_list[i+1]: + itens_to_be_reinserted.append(main_list[i+1]) + main_list.pop(i+1) + + else: + i += 1 + + if not itens_to_be_reinserted and main_list == main_list_copy: + return main_list + + print(main_list) + + if len(itens_to_be_reinserted)>1: + itens_to_be_reinserted = send_to_goulag(itens_to_be_reinserted) + + i = 0 + + while i < len(main_list) - 1: + if itens_to_be_reinserted[0] < main_list[i]: + main_list[i:i] = itens_to_be_reinserted + itens_to_be_reinserted.clear() + break + i += 1 + + main_list = send_to_goulag(main_list) + + return main_list - while idx < len(input_list) - 1: - if input_list[idx] > input_list[idx + 1]: - temp.append(input_list[idx + 1]) - # pop(idx+1) é uma operação O(N) no pior caso - input_list.pop(idx + 1) - else: - idx += 1 - # Chamada recursiva (pode adicionar complexidade se for muito frequente) - if len(temp) > 1: - temp = send_to_goulag(temp) - idx = 0 - # Loop para reinserir elementos de 'temp' na lista principal - while idx < len(input_list): - if temp and input_list[idx] > temp[0]: - # Inserção no meio da lista input_list[idx:idx] = temp é O(N) no pior caso - input_list[idx:idx] = temp - temp.clear() - break - idx += 1 - if len(temp) == 0: - return input_list - if temp: - input_list.extend(temp) # extend é O(k) onde k é o tamanho de temp - temp.clear() \ No newline at end of file