排序 歸併排序 遞迴和非遞迴實現

2021-10-08 20:12:49 字數 1459 閱讀 8813

# 歸併排序的遞迴實現

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...