Completely changed the algorithm, but its now failing 4 tests out of the 13 tests.
need fix
This commit is contained in:
parent
8b42d43574
commit
72279ed09e
|
|
@ -1,81 +1,42 @@
|
||||||
def send_to_goulag(input_list:list)-> list :
|
import copy
|
||||||
"""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)
|
|
||||||
[]
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
idx = 0
|
def send_to_goulag(main_list:list)->list:
|
||||||
temp = []
|
if not main_list:
|
||||||
while True:
|
return main_list
|
||||||
|
itens_to_be_reinserted = []
|
||||||
|
|
||||||
if not input_list:
|
main_list_copy = copy.deepcopy(main_list)
|
||||||
return []
|
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()
|
|
||||||
Loading…
Reference in New Issue