要点
复杂度
时间复杂度 |
空间复杂度 |
稳 定 性 |
平均情况 |
最好情况 |
最坏情况 |
O(nlog2n) |
O(nlog2n) |
O(nlog2n) |
O(n) |
稳定 |
解法
递归
class Solution:
"""
@param A: an integer array
@return: nothing
"""
def sortIntegers2(self, A):
if not A or len(A) == 1:
return A
self.mergeSort(A, 0, len(A) - 1)
return A
def mergeSort(self, A, low, high):
if low >= high:
return
mid = low + (high - low) // 2
self.mergeSort(A, low, mid)
self.mergeSort(A, mid+1, high)
self.mergeArray(A, low, mid, high)
def mergeArray(self, A, low, mid, high):
tmpArrary = A[low:high+1]
i, j, k = 0, mid-low+1, low
while i <= mid-low and j <= high-low:
if tmpArrary[i] <= tmpArrary[j]:
A[k] = tmpArrary[i]
i += 1
else:
A[k] = tmpArrary[j]
j += 1
k += 1
if i > mid-low+1:
while j <= high-low:
A[k] = tmpArrary[j]
j += 1
k += 1
if j > high-low:
while i <= mid - low:
A[k] = tmpArrary[i]
i += 1
k += 1
非递归
class Solution:
"""
@param A: an integer array
@return: nothing
"""
def sortIntegers2(self, A):
if not A or len(A) == 1:
return A
self.mergeSort(A, 0, len(A) - 1)
def mergeSort(self, A, low, high):
stack = [(low, high)]
while stack:
group = stack.pop()
if len(group) == 3:
self.mergeArray(A, *group)
else:
low, high = group
if low < high:
mid = low + (high - low) // 2
stack.append((low, mid, high))
stack.append((low, mid))
stack.append((mid+1, high))
def mergeArray(self, A, low, mid, high):
tmpArrary = A[low:high+1]
i, j, k = 0, mid-low+1, low
while i <= mid-low and j <= high-low:
if tmpArrary[i] <= tmpArrary[j]:
A[k] = tmpArrary[i]
i += 1
else:
A[k] = tmpArrary[j]
j += 1
k += 1
if i > mid-low+1:
while j <= high-low:
A[k] = tmpArrary[j]
j += 1
k += 1
if j > high-low:
while i <= mid - low:
A[k] = tmpArrary[i]
i += 1
k += 1
近期评论