所以我只是在实践中实现一些经典的排序算法,并提出了用于合并排序的解决方案:
def merge_sort(numbers):
'''Sorts a list based on the traditional merge-sort'''
if len(numbers) <= 1:
return numbers
result = []
mid = len(numbers) // 2
left = merge_sort(numbers[mid:])
right = merge_sort(numbers[:mid])
l_idx = 0
r_idx = 0
# compare all numbers in the two lists
while l_idx < len(left) and r_idx < len(right):
if left[l_idx] > right[r_idx]:
result.append(right[r_idx])
r_idx += 1
else:
result.append(left[l_idx])
l_idx += 1
# make sure leftover numbers are added to result
result += left[l_idx:]
result += right[r_idx:]
return result
似乎可行,例如:
>> number_list = [1, 3, 7, 8, 12, 23, 41, 3, 7, 12, 41, 24, 29]
>> sorted(number_list)
[1, 3, 3, 7, 7, 8, 12, 12, 23, 24, 29, 41, 41]
>> merge_sort(number_list)
[1, 3, 3, 7, 7, 8, 12, 12, 23, 24, 29, 41, 41]
输出正确且排序正确,但是当我运行如下所示的单元测试时:
import sorting as s
import unittest
import random
unsorted_list = [random.randint(1, 120) for _ in range(100)]
expected_sorted_list = sorted(unsorted_list)
def test_mergesort(self):
merge_sorted_list = s.merge_sort(unsorted_list)
self.assertEqual(expected_sorted_list, merge_sorted_list)
然后我随后运行:
>> python -m unittest test_sorting
AssertionError: Lists differ: [4, 4[42 chars]2, 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22,[308 chars] 120] != [4, 4[42 chars]2, 13]
First list contains 84 additional elements.
First extra element 16:
14
Diff is 762 characters long. Set self.maxDiff to None to see it.
----------------------------------------------------------------------
Ran 2 tests in 0.002s
FAILED (failures=1)
为什么单元测试会引发错误?即使我已经测试了合并排序功能,但似乎排序正确。
目录结构:
/classical-algorithms
sorting.py
test_sorting.py
答案 0 :(得分:0)
让包含测试的python文件为test_sorting.py
。
然后以下对我有用:
import sorting as s
import unittest
import random
unsorted_list = [random.randint(1, 120) for _ in range(100)]
expected_sorted_list = sorted(unsorted_list)
class tests(unittest.TestCase):
def test_mergesort(self):
merge_sorted_list = s.merge_sort(unsorted_list)
self.assertEqual(expected_sorted_list, merge_sorted_list)
运行测试:
$python -m unittest test_sorting
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
答案 1 :(得分:0)
我似乎找到了错误。我的旧单元测试文件如下所示:
import sorting as s
import unittest
import random
unsorted_list = [random.randint(1, 120) for _ in range(100)]
expected_sorted_list = sorted(unsorted_list)
def test_bubblesort(self):
bubble_sorted_list = s.bubble_sort(unsorted_list)
self.assertEqual(expected_sorted_list, bubble_sorted_list)
def test_mergesort(self):
merge_sorted_list = s.merge_sort(unsorted_list)
self.assertEqual(expected_sorted_list, merge_sorted_list)
我也在测试我先前实现的bubble_sort。当我将其更改为此:
import sorting as s
import unittest
import random
class TestSorters(unittest.TestCase):
def test_bubblesort(self):
unsorted_list = [random.randint(1, 120) for _ in range(100)]
expected_sorted_list = sorted(unsorted_list)
bubble_sorted_list = s.bubble_sort(unsorted_list)
self.assertEqual(expected_sorted_list, bubble_sorted_list)
def test_mergesort(self):
unsorted_list = [random.randint(1, 120) for _ in range(100)]
expected_sorted_list = sorted(unsorted_list)
merge_sorted_list = s.merge_sort(unsorted_list)
self.assertEqual(expected_sorted_list, merge_sorted_list)
一切正常。这很奇怪吗?