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 直到某一指標達到序列尾 將另一串行剩下的所有元素直...