I've implemented a (version of) Merge Sort algorithm in Python. My goal here is two-fold:
- Improve understanding of Merge Sort and recursion in a language agnostic way.
- Improve understanding of Python conventions and idioms.
The implementation recursively splits the given sequence into left and right sequences and then merges the two subsequences back together sorted in ascending order.
All suggestions for improvement are welcome. I'd especially like feedback on the following:
- looping through total length of sequence and the unused variable.
- use of try-except blocks.
- use of indexing and slicing.
class MergeSort(object):
def sort(self, seq):
'''
Sorts a sequence of integers.
@param seq: an unsorted tuple or list.
@return: a new tuple with elements in @seq sorted in ascending order.
'''
if(len(seq) <= 1):
return seq
else:
return self._merge(leftSortedSeq=self.sort(seq[0:(len(seq) / 2)]),
rightSortedSeq=self.sort(seq[(len(seq) / 2):]))
def _merge(self, leftSortedSeq, rightSortedSeq):
if(len(leftSortedSeq) == 0):
return rightSortedSeq
elif(len(rightSortedSeq) == 0):
return leftSortedSeq
leftPointer = 0
rightPointer = 0
mergedSeq = []
mergedSeqLength = len(leftSortedSeq) + len(rightSortedSeq)
for elementNumber in range(mergedSeqLength):
try:
smallestInLeft = leftSortedSeq[leftPointer]
except IndexError:
mergedSeq += rightSortedSeq[rightPointer:]
return tuple(mergedSeq)
try:
smallestInRight = rightSortedSeq[rightPointer]
except IndexError:
mergedSeq += leftSortedSeq[leftPointer:]
return tuple(mergedSeq)
if(smallestInLeft < smallestInRight):
mergedSeq.append(leftSortedSeq[leftPointer])
leftPointer += 1
else:
mergedSeq.append(rightSortedSeq[rightPointer])
rightPointer += 1
return tuple(mergedSeq)