Division and Recurson--merge sort
import unittest
def merge(list1, list2, list1_begin, list1_end, list2_begin, list2_end):
list3 = []
i = list1_begin
j = list2_begin
while (i<list1_end) and (j < list2_end):
if list1[i] < list2[j]:
list3.append(list1[i])
i = i+1
else:
list3.append(list2[j])
j = j+1
while(i<list1_end):
list3.append(list1[i])
i = i+1
while(j<list2_end):
list3.append(list2[j])
j = j+1
return list3
def array_need_to_be_merged(array, begin, end):
list1 = []
i = begin
while(i<end):
list1.append(array[i])
i = i+1
return list1
def doMerge(origin_array, step):
i = 0
new1 =[]
new2 =[]
length = len(origin_array)
while i + 2*step < length:
list1 = array_need_to_be_merged(origin_array, i, i+step)
list2 = array_need_to_be_merged(origin_array, i+step, i +2*step)
new1 += merge(list1, list2, 0, step, 0, step)
i = i + 2*step
if i+step < length:
list1 = array_need_to_be_merged(origin_array, i, i+step)
list2 = array_need_to_be_merged(origin_array, i+step, length)
new2 += merge(list1, list2, 0, step, 0, length-i-step)
else:
while i < length:
new2.append(origin_array[i])
i = i+1
sorted_array = new1+new2
return sorted_array
def merge_sort(origin_array):
step =1
length = len(origin_array)
sorted_array = origin_array
while step < length:
sorted_array = doMerge(sorted_array, step)
step += step
print ("step value")
print (step)
sorted_array = doMerge(sorted_array,step)
return sorted_array
class test_merge_sort(unittest.TestCase):
def test_merge(self):
list1 =[1,3,7,8]
list2 =[2,4,5,6]
list3 =[1,2,3,4,5,6,7,8]
list4 = merge(list1, list2, 0, 4, 0,4)
self.assertEqual(list4,list3)
def test_do_merge(self):
list1 =[1,3,7,8]
list2 =[2,4,5,6]
list3 = list1 + list2
list4 = doMerge(list3, 4)
list5 = [1,2,3,4,5,6,7,8]
self.assertEqual(list4, list5)
def test_merge_sort(self):
list1 = [1,3,8,7, 4,2, 6,5]
sorted_array = merge_sort(list1)
self.assertEqual(sorted_array, [1,2,3,4,5,6,7,8])
if __name__=="__main__":
unittest.main()

浙公网安备 33010602011771号