分治演算法(二)合併排序

2021-09-09 06:05:32 字數 1846 閱讀 8829

1.問題分析

合併排序問題給定的是乙個無序的序列,可以把待排序的元素分解為兩個規模大致相等的子串行。如果還是不容易解決就繼續將子串行分解,直到子串行中的元素個數為1,因為單個元素的序列本身是有序的,此時便可以進行合併,從而得到乙個完整的有序序列。

2.演算法設計

(1)分解:將待排序元素分成大小大致相同的兩個子串行。

(2)治理:對兩個子串行進行合併。

(3)合併:將排好序的有序子串行進行合併,得到最終的有序序列。

3.過程描述

4.程式**

def merge(a,low,mid,high):

b = [none for i in range(0,high-low+1)] #定義乙個列表

i = low

j = mid + 1

k = 0

while(i <= mid and j <= high):

#按照從小到大的順序存放到列表b中

if(a[i] <= a[j]):

b[k] = a[i]

i += 1

k += 1

else:

b[k] = a[j]

j += 1

k += 1

while(i <= mid):

#將子串行a[low:middle]剩餘元素的依次複製到b中

b[k] = a[i]

i += 1

k += 1

while(j <= high):

# 將子串行a[middle+1:high]剩餘的元素依次複製到b中

b[k] = a[j]

j += 1

k += 1

temp = 0

for i in range(low,high+1):

#將合併後的序列複製到原來的a序列

a[i] = b[temp]

temp += 1

del b

def mergesort(a,low,high):

if low < high:

mid = (low + high) // 2

mergesort(a,low,mid) #對a[low:mid]中的元素合併排序

mergesort(a,mid + 1,high) #對a[mid+1:high]中的元素合併排序

merge(a,low,mid,high) #合併操作

if __name__ == '__main__':

a =

n = int(input('請輸入數列中的元素個數n為:'))

for i in range(n):

mergesort(a,0,n-1)

print('合併排序結果為:')

for i in range(n):

print(a[i],'\t',end='')

5.執行結果

請輸入數列中的元素個數n為:8

請依次輸入數列中的元素:3

請依次輸入數列中的元素:1

請依次輸入數列中的元素:5

請依次輸入數列中的元素:2

請依次輸入數列中的元素:6

請依次輸入數列中的元素:4

請依次輸入數列中的元素:8

請依次輸入數列中的元素:7

合併排序結果為:

1 2 3 4 5 6 7 8

6.複雜度分析

時間複雜度o(n logn)

空間複雜度o(n)

分治演算法之合併排序

合併排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列 1 分解 將待排序元素分成大小大致相同的兩個子串行 2 治理 對兩個子串行進行合併排序 3 合併 將排好序的有序子串行進行合併,得到最終的有序序列 合...

演算法簡結 遞迴分治(二) 合併排序

1.合併排序 基本思想就是先將n含有個元素的集合分成n 2個元素的子集合,分別對兩個子集合進行合併排序,最後將排好序的子集合合併。我用一張例項圖來概括一下。待排序集合為,首先將這個集合左右分解成兩個子集合,直到集合中的元素為乙個 只有乙個元素當然是已排好的 再依次將兩個已排序的子集合合併。最近在看的...

分治 合併排序 自然合併排序(C )

演算法步驟 引用自 菜鳥教程 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置 重複步驟 3 直到某一指標達到序列尾 將另一串行剩下的所有元素直...