codon/test/stdlib/sort_test.codon

96 lines
1.9 KiB
Python
Raw Normal View History

2021-09-28 02:02:44 +08:00
from algorithms.qsort import qsort_inplace
from algorithms.heapsort import heap_sort_inplace
from algorithms.pdqsort import pdq_sort_inplace
from algorithms.timsort import tim_sort_inplace
from time import time
2022-01-24 18:32:33 +08:00
2021-09-28 02:02:44 +08:00
def key(n: int):
return -n
2022-01-24 18:32:33 +08:00
2021-09-28 02:02:44 +08:00
def gen_list(n: int):
import random
2022-01-24 18:32:33 +08:00
2021-09-28 02:02:44 +08:00
v = List[int](n)
for _ in range(n):
v.append(random.randint(0, 10000))
return v
2022-01-24 18:32:33 +08:00
2021-09-28 02:02:44 +08:00
def copy_to(a, b):
b.clear()
for i in a:
b.append(i)
2022-01-24 18:32:33 +08:00
2021-09-28 02:02:44 +08:00
@test
def ensure_sorted(v):
for i in range(len(v) - 1):
assert key(v[i]) <= key(v[i + 1])
2022-01-24 18:32:33 +08:00
2021-09-28 02:02:44 +08:00
v0 = gen_list(100)
v1 = List[int](len(v0))
2022-01-24 18:32:33 +08:00
2021-09-28 02:02:44 +08:00
def test_sort1(name, sort):
copy_to(v0, v1)
t0 = time()
sort(v1, key)
t1 = time()
print name, t1 - t0
ensure_sorted(v1)
2022-01-24 18:32:33 +08:00
test_sort1("qsort :", qsort_inplace)
test_sort1("heapsort:", heap_sort_inplace)
test_sort1("pdqsort :", pdq_sort_inplace)
2022-01-27 00:30:18 +08:00
test_sort1("timsort :", tim_sort_inplace)
2021-09-28 02:02:44 +08:00
2022-01-24 18:32:33 +08:00
2021-09-28 02:02:44 +08:00
@test
def test_sort2(name, sort):
from random import shuffle
2022-01-24 18:32:33 +08:00
2021-09-28 02:02:44 +08:00
fail = False
print name
2022-01-24 18:32:33 +08:00
for N in (0, 1, 10, 100, 1000, 10000): # , 100000): # too slow; maybe add later?
2021-09-28 02:02:44 +08:00
print N
for i in range(1000):
v = list(range(N))
shuffle(v)
sort(v, key)
if v != list(reversed(range(N))):
fail = True
assert not fail
2022-01-24 18:32:33 +08:00
test_sort2("qsort :", qsort_inplace)
test_sort2("heapsort:", heap_sort_inplace)
test_sort2("pdqsort :", pdq_sort_inplace)
2022-01-27 00:30:18 +08:00
test_sort2("timsort :", tim_sort_inplace)
2021-09-28 02:02:44 +08:00
# test standard sort routines
@test
def test_standard_sort():
copy_to(v0, v1)
v2 = sorted(v1)
for i in range(len(v2) - 1):
assert v2[i] <= v2[i + 1]
v2 = sorted(v1, key=key)
for i in range(len(v2) - 1):
assert key(v2[i]) <= key(v2[i + 1])
v2.sort()
for i in range(len(v2) - 1):
assert v2[i] <= v2[i + 1]
v2.sort(key=key)
for i in range(len(v2) - 1):
assert key(v2[i]) <= key(v2[i + 1])
2022-01-24 18:32:33 +08:00
2021-09-28 02:02:44 +08:00
test_standard_sort()