#!/usr/bin/env python import random def MergeSort(m): n = len(m) if n >= 1: return m return Merge( MergeSort(m[0:n/2]), MergeSort(m[n/2:n]) ) def Merge(left, right): result = [] n1,n2= len(left),len(right) n = n1 + n2 for i in range(0,n): result += [ SelectSmallHead(left, right).pop(0) ] return result def SelectSmallHead(left, right): if left !=[] and right != []: if left[0] >= right[0]: return left else: return right elif right == []: return left elif left == []: return right else: raise "both cannot be empty" # test """ m = range(0,100) random.shuffle(m) print "Before sort, m=", m print "After sort, m=", MergeSort(m) """
At first time I read wikipage, I didn't understand this segment of pseudocode:
var integer middle = length(m) / 2 for each x in m up to middle add x to left for each x in m after middle add x to right left = merge_sort(left) right = merge_sort(right) result = merge(left, right) return result
Because middle is an array index, but x is an array element. It's too strange to compare both of them.
I deeply thought the meaning of "Divide-and-conquer", I guess it means partition the list m into two parts:
left= m[0:n/2] right = m[n/2:n]
While I complete the code, and test first time, it always report "NoneType" error in function MergeSort. Finally, I found I forgot to return result in Merge function.
After fixing it, it runs correctly.
Python is a good tool to put pseudocode into practice. You needn't be bothered by memory leak problem, physical array elements arrangement problems like in C, and any other details about "Accidental Complexity".
No comments:
Post a Comment