# 歸併排序的遞迴實現
import math
# 遞迴實現
defmerge_sort
(arr):if
len(arr)
<2:
return arr
middle = math.floor(
len(arr)/2
) left, right = arr[
0:middle]
, arr[middle:
]return merge(merge_sort(left)
, merge_sort(right)
)# 合併兩個排好序的序列
defmerge
(left, right)
: result =
l, r =0,
0while l <
len(left)
and r <
len(right)
:if left[l]
<= right[r]:)
l +=
1else:)
r +=
1while l <
len(left):)
l +=
1while r <
len(right):)
r +=
1return result
# 歸併排序的非遞迴實現
defmerge_sort
(arr)
:# 初始步長
step =
2# 序列長度
arr_len =
len(arr)
while step <
len(arr)*2
:# 初始化三個指標
left =
0 right = step
mid = math.ceil(
(left + right)//2
)# right越界,設定為最大值
if right > arr_len:
right = arr_len
# left不越界,繼續分組排序,排序完成指標繼續右移
while left < arr_len:
# 排序替換原序列
arr[left:right]
= merge(arr[left:mid]
, arr[mid:right]
)# left,right,mid右移
left += step
right = left + step
mid = math.ceil(
(left + right)//2
)# right越界,設定為最大值
if right > arr_len:
right = arr_len
# 步長兩倍遞增
step *=
2return arr
遞迴和非遞迴實現歸併排序
1 遞迴實現歸併排序 遞迴排序其實也是利用了完全二叉樹的結構形式,所以時間複雜度和logn掛鉤的。具體遞迴版的歸併排序呢,看下面的 public class ms print s mergesort s system.out.println 排序後的陣列 print s public static ...
歸併排序 遞迴和非遞迴
一 遞迴 遞迴版本 採用分治的方法,將n個元素自頂向下分成兩個n 2的子問題,再將子問題進行劃分,最終將整個問題分解成每個字表長度為 1 的有序表,然後自底向上成對歸併。include int b 100 中間過程陣列 void merge int a,int low,int mid,int hig...
歸併排序(遞迴 非遞迴 自然歸併排序)
演算法思想 歸併排序是分治法的典型應用,其思想是不斷地將兩個有序的陣列合併為乙個有序陣列。遞迴實現 include void merge int a,int left,int m,int right void mergesortaux int a,int left,int right void me...