我在Python中实现了合并排序算法的(版本)。我的目标是双重的:
该实现递归地将给定序列拆分为左序列和右序列,然后将这两个子序列合并回按升序排序的子序列。
欢迎所有改进建议。我特别希望得到以下方面的反馈:
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)发布于 2014-05-10 14:27:44
如果您有像下面这样的表达式
if(x == 0) 然后你可以把它重写为
if not x你可以去掉括号,这样写就能使它变得更像奏鸣曲。
同样,你也是一个重写者:
if(len(leftSortedSeq) == 0):
return rightSortedSeq
elif(len(rightSortedSeq) == 0):
return leftSortedSeq作为
if not len(leftSortedSeq):
return rightSortedSeq
elif not len(rightSortedSeq):
return leftSortedSeq如果我是你,我将避免使用多余的情况,这是可以避免使用简单的,如果其他。这将使代码更加清晰。
我们可以通过稍微修改代码来避免异常。
我也避免了转换成元组。元组和列表的连接可能会导致问题。所以最好避免不必要的转换。
lenLeftSeq = len(leftSortedSeq)
lenRightSeq = len(rightSortedSeq)
while leftPointer < lenLeftSeq and rightPointer < lenRightSeq:
smallestInLeft = leftSortedSeq[leftPointer]
smallestInRight = rightSortedSeq[rightPointer]
if(smallestInLeft < smallestInRight):
mergedSeq.append(smallestInLeft)
leftPointer += 1
else:
mergedSeq.append(smallestInRight)
rightPointer += 1
return mergedSeq +
leftSortedSeq[leftPointer:] +
rightSortedSeq[rightPointer:]https://codereview.stackexchange.com/questions/49395
复制相似问题