归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
- 时间复杂度为O(nlogn) 这是该算法中最好、最坏和平均的时间性能。
- 空间复杂度为 O(n)
- 比较操作的次数介于(nlogn) / 2和nlogn - n + 1。
- 赋值操作的次数是(2nlogn)。
归并排序比较占用内存,但却效率高且稳定的算法。
图:对一个随机点的链表进行排序
def MargeSort(arr):
def marge(start, mid, end):
leftLength = mid - start + 1
rightLength = end - mid
left = [0] * leftLength
right = [0] * rightLength
for i in range(0, leftLength):
left[i] = arr[start + i]
for j in range(0, rightLength):
right[j] = arr[mid + j +1]
i = j = 0
k = start
while i < leftLength and j < rightLength:
if left[i] < right[j]:
arr[k] = left[i]
i += 1
else:
arr[k] = right[j]
j += 1
k += 1
if i < leftLength:
for i in range(i, leftLength):
arr[k] = left[i]
i += 1
k += 1
if j < rightLength:
for j in range(j, rightLength):
arr[k] = right[j]
j += 1
k += 1
def sort(start, end):
if start < end:
mid = (end + start) // 2
sort(start, mid)
sort(mid+1, end)
marge(start, mid, end)
sort(0, len(arr)-1)
测试代码:
a = [2,4,7,9,1,5,11,566,6]
MargeSort(a)
print(a)
输出结果:
[1, 2, 4, 5, 6, 7, 9, 11, 566]