歸併排序的核心是,每次將兩個有序陣列組合成為乙個新的有序陣列。對於倆個有序陣列:
def merge(a:list,b:list)-->list:
l_a,l_b = len(a),len(b)
res = [0 for i in range(l_a+l_b)]
index = 0
i,j = 0,0
while i歸併排序中,兩個有序陣列是一段連續陣列的倆部分:
#arr 傳入陣列,l,mid,r 傳入陣列的左邊界,中間,右邊界。l到mid與mid到r均有序,對l到r進行排序
def merge(arr,l,mid,r):
hel = [0 for i in range(r-l+1)]
i = 0
p1,p2 = l,mid+1
while p1<=mid and p2<=r:
if arr[p1]對於歸併排序:
#歸併排序,arr:排序陣列 l:排序陣列左邊界,r:排序陣列右邊界。遞迴最深處的排序陣列均為乙個數字的陣列,可以視為有序陣列。
def sortprocess(arr,l,r):
if l==r:
return
mid = (l+r>>1)
sortprocess(arr,l,mid)
sortprocess(arr,mid+1,r)
merge(arr,l,mid,r)
def merge(arr,l,mid,r):
hel = [0 for i in range(r-l+1)]
i = 0
p1,p2 = l,mid+1
while p1<=mid and p2<=r:
if arr[p1]附上完整**+對數器
import random
#size:陣列長度
#end:範圍
def getrandomarray(size,end,start=1):
res = [random.randint(start,end) for i in range(size)]
return res
def sortprocess(arr,l,r):
if l==r:
return
mid = (l+r>>1)
sortprocess(arr,l,mid)
sortprocess(arr,mid+1,r)
merge(arr,l,mid,r)
def merge(arr,l,mid,r):
hel = [0 for i in range(r-l+1)]
i = 0
p1,p2 = l,mid+1
while p1<=mid and p2<=r:
if arr[p1]結果集:
[2, 1, 4, 10, 7, 5, 14, 1, 8, 2, 10, 10, 9, 15, 15, 12, 4, 2, 11, 3]
[1, 1, 2, 2, 2, 3, 4, 4, 5, 7, 8, 9, 10, 10, 10, 11, 12, 14, 15, 15]
true
時間複雜度o(nlogn),空間複雜度o(n)
同時,倆個陣列合併的merge函式可以修改為:
def merge(arr,l,mid,r):
hel = [0 for i in range(r-l+1)]
i = 0
p1,p2 = l,mid+1
while p1<=mid and p2<=r:
if arr[p1]與原函式沒有差距。
八大排序演算法 之 歸併排序
排序思想 如圖所示 排序趟數 如果2 n 如此例,length 9 8,趟數是4.排序原理 1,第一趟將相鄰兩個數歸併成乙個有序的小組合 2,第二趟將相鄰兩個有序小組合歸併成乙個更大的的有序組合 3,依次類推,直到將所有數歸併成乙個最大的組合 具體 實現如下 歸併排序主方法 public stati...
八大排序演算法之歸併排序
介紹到這裡只剩下歸併排序和基數排序沒有介紹過了。這兩種演算法各有各的特點,歸併排序是分治法的一種有效應用,所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。而基數排序又稱為桶排序,是唯一一種不需要元素之間相互比較就可以排好序的排序演算法。一 歸併排序 1.基本思想 這裡介紹的歸併排序是非遞迴版...
八大排序演算法之歸併排序
說明 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2 路歸併。思路 1.將序列中待排序數字分...