</pre>描述:<p></p><p><span style="white-space:pre"></span>1.先将它分成两半,分别排序,然后将结果归并</p><p><span style="white-space:pre"></span>2.O(nlogn)(最好与最坏都一样)</p><p><span style="white-space:pre"></span>3.稳定的排序</p><p>Code:</p><p>自顶向下(体现分治法的思想)</p><p></p><pre code_snippet_id="1643953" snippet_file_name="blog_20160412_2_2719246" name="code" class="python">class Sort:
arrTemp = None
@classmethod
def sort(cls,arr):
arrTemp = [0 for i in range(0, len(arr))]
cls.sortMerge(arr, 0, len(arr) - 1)
@classmethod
def sortMerge(cls, arr, lo, hi):
if hi <= lo :
return
mid = lo + (hi - lo)/2
cls.sortMerge(arr, lo, mid)
cls.sortMerge(arr, mid + 1, hi)
cls.merge(arr, lo, mid, hi)
@classmethod
def merge(cls, arr, lo, mid, hi):
i = lo
j = mid + 1
arrTemp = arr[:]
k = lo
while k <= hi:
if arrTemp[j] < arrTemp[i]:
arr[k] = arrTemp[j]
j += 1
k += 1
else:
arr[k] = arrTemp[i]
i += 1
k += 1
while i > mid and k <= hi:
arr[k] = arrTemp[j]
k += 1
j += 1
while j > hi and k <= hi:
arr[k] = arrTemp[i]
i += 1
k += 1
自底向上(适合于链表)
class Sort:
arrTemp = None
@classmethod
def sort(cls, arr):
n = len(arr)
arrTemp = [0 for i in range(0, n)]
size = 1
while size < n:
lo = 0
while lo < n - size:
cls.merge(arr, lo, lo+size - 1, min(lo+size+size-1, n - 1))
lo += size + size
size = size + size
return
@classmethod
def merge(cls, arr, lo, mid, hi):
i = lo
j = mid + 1
arrTemp = arr[:]
k = lo
while k <= hi:
if arrTemp[j] < arrTemp[i]:
arr[k] = arrTemp[j]
j += 1
k += 1
else:
arr[k] = arrTemp[i]
i += 1
k += 1
while i > mid and k <= hi:
arr[k] = arrTemp[j]
k += 1
j += 1
while j > hi and k <= hi:
arr[k] = arrTemp[i]
i += 1
k += 1