歸併排序也是採用分治法,它將待排序序列分為若干個子串行,先使每個子串行有序,然後再將已有有序子串行合併為整體有序序列。
演算法分為兩步:遞迴和合併
(1)、遞迴:先把待排序陣列以中點二分,接著把左邊子陣列繼續二分,再把右邊子陣列繼續二分,直到陣列長度小於等於1,最後把左子陣列和右子陣列合併為有序的區間,合併步驟見(2)。
(2)、合併:比較左子陣列a[i]和右子陣列b[j]的元素,若a[i]
def
mergesort
(seq):
if len(seq) <= 1:
return seq
mid = int(len(seq)/2)
left = mergesort(seq[:mid])
right = mergesort(seq[mid:])
return merge(left, right)
defmerge
(left, right):
result =
i,j = 0,0
while iand jif left[i] <= right[j]:
i += 1
else:
j += 1
result += left[i:]
result += right[j:]
return result
# n = [4,12,7,9,1]
n = [1,-2,4]
n_sort = mergesort(n)
print(n_sort)
一般用於總體無序,但各子項相對有序的數列效果較好,為穩定排序演算法。
歸併排序中的合併操作花費的時間較大,影響整體演算法的效率,尤其在大資料陣列情況下。
時間複雜度為o(nlogn);空間複雜度為o(n)
經典演算法 歸併排序
題目說明 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法也是採用分治法 divide and conquer 的乙個非常典型的應用。演算法複雜度為o n logn 題目解析 歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半...
經典排序演算法之 歸併排序
1 思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。2 演算法時間複雜度 最好的情況下 一趟歸併需要n次,總共需要logn次,因此為o n logn 最壞的情況下,接近於平均情況下,為o n logn 說明 對長度為n的檔案,需進行logn 趟二路歸併,每趟歸併的時間為o n 故其時間複雜度...
經典排序演算法之歸併排序
原理,把原始陣列分成若干子陣列,對每乙個子陣列進行排序,繼續把子陣列與子陣列合併,合併後仍然有序,直到全部合併完,形成有序的陣列 舉例無序陣列 6 2 4 1 5 9 先看一下每個步驟下的狀態,完了再看合併細節 第一步 6 2 4 1 5 9 原始狀態 第二步 2 6 1 4 5 9 兩兩合併排序,...