歸併排序Python程式碼
阿新 • • 發佈:2018-11-25
歸併排序是面試最常考內容,
讓你描述演算法,
讓你寫演算法,
讓你分析時間複雜度
歸併排序merge sort思路:
歸併排序中間劈一刀,陣列分兩半,兩邊排好序,最後把左右兩個合併。就是先區域性有序,再整體有序。
時間複雜度
歸併排序複雜度最好,最壞,平均都是nlogn。是嚴格的nlogn複雜度。
空間複雜度
歸併排序需要額外的O(N)空間,因為要合併兩個陣列,不可能在原地合併陣列,必須要開闢新的空間來合併
採用了九章演算法老師Java版本,直接無腦翻譯為了Python版本
class Solution(): def sortIntegers2(self, A): if not A: return temp = [0] * len(A) return self.mergeSort(A, 0, len(A) - 1, temp) def mergeSort(self, A, start, end, temp): if start >= end: return #無腦先分為兩半 #先遞迴到左邊進行排序 self.mergeSort(A, start, (start + end)//2, temp) #再遞迴到右邊進行排序 self.mergeSort(A, (start + end)//2 + 1, end, temp) #合併陣列的左右兩部分 return self.merge(A, start, end, temp) #合併兩個子陣列 def merge(self, A, start, end, temp): middle = (start + end) // 2 leftIndex = start #左側子陣列指標 rightIndex = middle + 1 #右側子陣列指標 index = leftIndex # 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置 while leftIndex <= middle and rightIndex <= end: if A[leftIndex] < A[rightIndex]: temp[index] = A[leftIndex] index += 1 leftIndex += 1 else: temp[index] = A[rightIndex] index += 1 rightIndex += 1 #最後有可能剩下一個陣列還沒有結束 while leftIndex <= middle: temp[index] = A[leftIndex] index += 1 leftIndex += 1 while rightIndex <= end: temp[index] = A[rightIndex] index += 1 rightIndex += 1 #把臨時陣列的值依次給 for i in range(start, end+1): A[i] = temp[i] #A = temp return A obj = Solution() a = [3,2,1,4,5] b = obj.sortIntegers2(a) print(b)
輸出:
[1, 2, 3, 4, 5]
[Finished in 0.1s]
網頁測試的程式碼
class Solution(): def sortIntegers2(self, A): if not A: return temp = [0] * len(A) self.mergeSort(A, 0, len(A) - 1, temp) def mergeSort(self, A, start, end, temp): if start >= end: return #無腦先分為兩半 #先遞迴到左邊進行排序 self.mergeSort(A, start, (start + end)//2, temp) #再遞迴到右邊進行排序 self.mergeSort(A, (start + end)//2 + 1, end, temp) #合併陣列的左右兩部分 self.merge(A, start, end, temp) #合併兩個子陣列 def merge(self, A, start, end, temp): middle = (start + end) // 2 leftIndex = start #左側子陣列指標 rightIndex = middle + 1 #右側子陣列指標 index = leftIndex while leftIndex <= middle and rightIndex <= end: if A[leftIndex] < A[rightIndex]: temp[index] = A[leftIndex] index += 1 leftIndex += 1 else: temp[index] = A[rightIndex] index += 1 rightIndex += 1 #最後有可能剩下一個陣列還沒有結束 while leftIndex <= middle: temp[index] = A[leftIndex] index += 1 leftIndex += 1 while rightIndex <= end: temp[index] = A[rightIndex] index += 1 rightIndex += 1 #把臨時陣列的值依次給 for i in range(start, end+1): A[i] = temp[i] #A = temp
https://www.lintcode.com/problem/sort-integers-ii/description
測試通過了
認識你是我們的緣分,同學,等等,學習人工智慧,記得關注我。
微信掃一掃
關注該公眾號