108 lines
2.5 KiB
Python
108 lines
2.5 KiB
Python
|
"""
|
||
|
Voir commentaires concernant ce module dans l'enonce de la serie de TP.
|
||
|
"""
|
||
|
|
||
|
import random
|
||
|
import umons_cpu
|
||
|
|
||
|
def python_sort(t):
|
||
|
t.sort()
|
||
|
|
||
|
def insertion_sort(t):
|
||
|
n = len(t)
|
||
|
for i in range(1,n):
|
||
|
clef = t[i]
|
||
|
j = i - 1
|
||
|
while j >= 0 and t[j] > clef:
|
||
|
t[j+1] = t[j]
|
||
|
j = j - 1
|
||
|
t[j+1] = clef
|
||
|
|
||
|
def selection_sort(t):
|
||
|
n = len(t)
|
||
|
for i in range(n-1):
|
||
|
small = i
|
||
|
for j in range(i+1,n):
|
||
|
if t[j] < t[small]:
|
||
|
small = j
|
||
|
(t[i], t[small]) = (t[small], t[i])
|
||
|
|
||
|
# permet d'avoir une interface in place, similaire aux autres tris
|
||
|
def merge_sort(t):
|
||
|
t[:] = merge_sort_functionnal(t)
|
||
|
|
||
|
def merge_sort_functionnal(t):
|
||
|
n = len(t)
|
||
|
if n > 1:
|
||
|
(t1, t2) = split(t)
|
||
|
t1 = merge_sort_functionnal(t1)
|
||
|
t2 = merge_sort_functionnal(t2)
|
||
|
return merge(t1, t2)
|
||
|
else:
|
||
|
return t
|
||
|
|
||
|
def split(t):
|
||
|
""" precondition: len(t) >= 2 """
|
||
|
mid = len(t) // 2
|
||
|
t1 = t[:mid]
|
||
|
t2 = t[mid:]
|
||
|
return (t1, t2)
|
||
|
|
||
|
def merge(t1, t2):
|
||
|
if len(t1) == 0:
|
||
|
return t2
|
||
|
elif len(t2) == 0:
|
||
|
return t1
|
||
|
elif t1[0] < t2[0]:
|
||
|
return [t1[0]] + merge(t1[1:], t2)
|
||
|
else:
|
||
|
return [t2[0]] + merge(t1, t2[1:])
|
||
|
|
||
|
def dicho_search(t, x):
|
||
|
start = 0
|
||
|
end = len(t) - 1
|
||
|
mid = start + (end - start) // 2
|
||
|
while (end - start > 0) and x != t[mid]:
|
||
|
if x < t[mid]:
|
||
|
end = mid - 1
|
||
|
else:
|
||
|
start = mid + 1
|
||
|
mid = start + (end - start) // 2
|
||
|
if len(t) > 0 and x == t[mid]:
|
||
|
return mid
|
||
|
else:
|
||
|
return None
|
||
|
|
||
|
def test(n):
|
||
|
t1 = list(range(n))
|
||
|
t2 = list(range(n,0,-1))
|
||
|
t3 = []
|
||
|
for i in range(n):
|
||
|
t3.append(random.randint(0,n))
|
||
|
print('%7d %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f' % (
|
||
|
n,
|
||
|
umons_cpu.cpu_time(selection_sort, t1),
|
||
|
umons_cpu.cpu_time(insertion_sort, t1),
|
||
|
umons_cpu.cpu_time(merge_sort, t1),
|
||
|
umons_cpu.cpu_time(selection_sort, t2),
|
||
|
umons_cpu.cpu_time(insertion_sort, t2),
|
||
|
umons_cpu.cpu_time(merge_sort, t2),
|
||
|
umons_cpu.cpu_time(selection_sort, t3),
|
||
|
umons_cpu.cpu_time(insertion_sort, t3),
|
||
|
umons_cpu.cpu_time(merge_sort, t3)))
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
print('Temps affiches en msec')
|
||
|
print(' n '
|
||
|
't1: sel '
|
||
|
' ins '
|
||
|
' mer '
|
||
|
't2: sel '
|
||
|
' ins '
|
||
|
' mer '
|
||
|
't3: sel '
|
||
|
' ins '
|
||
|
' mer')
|
||
|
for i in range(100, 901, 100):
|
||
|
test(i)
|