3 Commits
2 changed files with 80 additions and 10 deletions
+47 -9
View File
@@ -47,11 +47,17 @@ def send_to_goulag(input_list:list)-> list :
idx = 0 idx = 0
temp = [] temp = []
is_sorted = True
while True: while True:
if not input_list: if not input_list:
return [] return []
if len(input_list)<=1:
return input_list
while idx < len(input_list) - 1: while idx < len(input_list) - 1:
if input_list[idx] > input_list[idx + 1]: if input_list[idx] > input_list[idx + 1]:
temp.append(input_list[idx + 1]) temp.append(input_list[idx + 1])
@@ -66,16 +72,48 @@ def send_to_goulag(input_list:list)-> list :
idx = 0 idx = 0
# Loop para reinserir elementos de 'temp' na lista principal # Loop para reinserir elementos de 'temp' na lista principal
while idx < len(input_list): merge_two_sorted_lists_in_place(input_list,temp)
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: if temp:
input_list.extend(temp) # extend é O(k) onde k é o tamanho de temp input_list.extend(temp) # extend é O(k) onde k é o tamanho de temp
temp.clear() temp.clear()
for i in range(len(input_list) - 1):
if input_list[i] > input_list[i + 1]:
is_sorted = False
break
if is_sorted:
return input_list
def merge_two_sorted_lists_in_place(list1: list, list2: list) -> list:
if not list2:
return list1
if not list1:
list1.extend(list2)
list2.clear()
return list1
ptr1 = 0
ptr2 = 0
while ptr1 < len(list1) and ptr2 < len(list2):
if list1[ptr1] > list2[ptr2]:
list1.insert(ptr1, list2[ptr2])
ptr1 += 1
list2.pop(ptr2)
else:
ptr1 += 1
if list2:
list1.extend(list2)
list2.clear() # Esvazia list2
return list1
+32
View File
@@ -5,6 +5,7 @@ import pytest
from goulag_sort import send_to_goulag from goulag_sort import send_to_goulag
def test_empty_list(): def test_empty_list():
assert send_to_goulag([]) == [] assert send_to_goulag([]) == []
@@ -14,6 +15,19 @@ def test_single_element():
def test_already_sorted(): def test_already_sorted():
assert send_to_goulag([10,20,45,50,60,100,150]) == [10,20,45,50,60,100,150] assert send_to_goulag([10,20,45,50,60,100,150]) == [10,20,45,50,60,100,150]
def test_list_all_equal():
assert send_to_goulag([5,5,5,5,5,5,5,5]) == [5,5,5,5,5,5,5,5]
def test_negative_numbers():
inputlist = [-4,15,-10,50,13]
expectedlist = sorted(copy.deepcopy(inputlist))
assert send_to_goulag(inputlist) == expectedlist
def test_float_numbers():
inputlist = [1.7,45.2,10.2,5.4,78.2]
expectedlist = sorted(copy.deepcopy(inputlist))
assert send_to_goulag(inputlist) == expectedlist
def test_reverse_sorted(): def test_reverse_sorted():
inputlist = [50,40,30,25,14,10,5] inputlist = [50,40,30,25,14,10,5]
expectedlist = [5,10,14,25,30,40,50] expectedlist = [5,10,14,25,30,40,50]
@@ -30,12 +44,30 @@ def test_simple_sort():
expectedlist = sorted(expectedlist) expectedlist = sorted(expectedlist)
assert send_to_goulag(inputlist) == expectedlist assert send_to_goulag(inputlist) == expectedlist
def test_partially_sorted_list():
inputlist = [10,20,30,4,12,2,56,15]
expectedlist = copy.deepcopy(inputlist)
expectedlist = sorted(expectedlist)
assert send_to_goulag(inputlist) == expectedlist
def test_duplicated_sort(): def test_duplicated_sort():
inputlist = [10,20,30,30,50,65,100] inputlist = [10,20,30,30,50,65,100]
expectedList = sorted(copy.deepcopy(inputlist)) expectedList = sorted(copy.deepcopy(inputlist))
assert send_to_goulag(inputlist) == expectedList assert send_to_goulag(inputlist) == expectedList
def test_list_with_zero_and_negatives():
inputlist = [0,50,-5,2,-10,7,15]
expectedList = sorted(copy.deepcopy(inputlist))
assert send_to_goulag(inputlist) == expectedList
def test_many_duplicates():
input_list = [7, 2, 7, 7, 1, 7, 3, 7]
expected_list = sorted(input_list[:])
assert send_to_goulag(input_list[:]) == expected_list
def test_really_long_sort(): def test_really_long_sort():
inputList = [random.randint(1,500000) for _ in range(10000)] inputList = [random.randint(1,500000) for _ in range(10000)]
expectedList = sorted(copy.deepcopy(inputList)) expectedList = sorted(copy.deepcopy(inputList))