1. 程式人生 > >歸併排序Python程式碼

歸併排序Python程式碼

歸併排序是面試最常考內容,

讓你描述演算法,

讓你寫演算法,

讓你分析時間複雜度

 

歸併排序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

測試通過了

 

認識你是我們的緣分,同學,等等,學習人工智慧,記得關注我。

 

微信掃一掃
關注該公眾號