2011-08-16 01:59:50 +00:00
|
|
|
# vim:fileencoding=utf-8
|
2011-08-16 02:34:46 +00:00
|
|
|
import math
|
|
|
|
|
2011-08-16 01:59:50 +00:00
|
|
|
|
2011-08-15 10:47:22 +00:00
|
|
|
def insertion_sort(a):
|
2011-08-16 01:59:50 +00:00
|
|
|
""" Θ(n^2) """
|
2011-08-15 10:47:22 +00:00
|
|
|
for j in range(1, len(a)):
|
|
|
|
key = a[j]
|
2011-08-15 10:35:27 +00:00
|
|
|
i = j - 1
|
2011-08-15 10:47:22 +00:00
|
|
|
while i >= 0 and a[i] > key:
|
|
|
|
a[i + 1] = a[i]
|
2011-08-15 10:35:27 +00:00
|
|
|
i = i - 1
|
2011-08-15 10:47:22 +00:00
|
|
|
a[i + 1] = key
|
2011-08-16 02:34:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
def merge_sort(m):
|
|
|
|
n = len(m)
|
|
|
|
if n <= 1:
|
|
|
|
return m
|
|
|
|
|
|
|
|
middle = math.ceil(n / 2)
|
|
|
|
|
|
|
|
left = m[:middle]
|
|
|
|
right = m[middle:]
|
|
|
|
|
|
|
|
left = merge_sort(left)
|
|
|
|
right = merge_sort(right)
|
|
|
|
|
|
|
|
return merge(left, right)
|
|
|
|
|
|
|
|
|
|
|
|
def merge(left, right):
|
|
|
|
result = []
|
|
|
|
|
|
|
|
while len(left) > 0 or len(right) > 0:
|
|
|
|
if len(left) > 0 and len(right) > 0:
|
|
|
|
if left[0] <= right[0]:
|
|
|
|
result.append(left.pop(0))
|
|
|
|
else:
|
|
|
|
result.append(right.pop(0))
|
|
|
|
|
|
|
|
elif len(left) > 0:
|
|
|
|
result.append(left.pop(0))
|
|
|
|
|
|
|
|
elif len(right) > 0:
|
|
|
|
result.append(right.pop(0))
|
|
|
|
|
|
|
|
return result
|
|
|
|
|