python實現陣列和連結串列的歸併排序
阿新 • • 發佈:2019-02-01
歸併排序是一種穩定的排序,採用分而治之策略,可以用於順序儲存結構,也易於在連結串列上實現。其原理如下圖:
演算法時間複雜度為 O(nlogn),空間複雜度為 O(n)。
1 在陣列上實現
def mergesort(seq): if len(seq)<=1: return seq mid=int(len(seq)/2) left=mergesort(seq[:mid]) right=mergesort(seq[mid:]) return merge(left,right) def merge(left,right): result=[] i,j=0,0 while i<len(left) and j<len(right): if left[i]<=right[j]: result.append(left[i]) i+=1 else: result.append(right[j]) j+=1 result+=left[i:] result+=right[j:] return result if __name__=='__main__': seq=[6,5,8,7] print(mergesort(seq))
輸出:
[5, 6, 7, 8]
2 在連結串列上實現
# Definition of ListNode class ListNode(object): def __init__(self, val, next=None): self.val = val self.next = next class Solution: """ @param: head: The head of linked list. @return: You should return the head of the sorted linked list, using constant space complexity. """ # 歸併法 def sortList(self, head): # write your code here if head is None or head.next is None: return head pre = head slow = head # 使用快慢指標來確定中點 fast = head while fast and fast.next: pre = slow slow = slow.next fast = fast.next.next left = head right = pre.next pre.next = None # 從中間打斷連結串列 left = self.sortList(left) right = self.sortList(right) return self.merge(left,right) def merge(self, left, right): pre = ListNode(-1) first = pre while left and right: if left.val < right.val: pre.next = left pre = left left = left.next else: pre.next = right pre = right right = right.next if left: pre.next = left else: pre.next = right return first.next
node1 = ListNode(4)
node2 = ListNode(3)
node3 = ListNode(2)
node4 = ListNode(1)
node1.next = node2
node2.next = node3
node3.next = node4
s = Solution()
result = s.sortList(node1)
while (result != None):
print(result.val)
result = result.next
輸出:
1
2
3
4