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()

posted @ 2016-04-02 15:59  zhaodonglin  Views(130)  Comments(0)    收藏  举报