歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併。歸併排序是一種穩定的排序方法。
原地歸併的抽象方法
local function merge(a,low,mid,hi)
local aux = {}
local i = low
local j = mid + 1
for ii,v in ipairs(a) do
aux[ii] = v
end
for k = low,hi do
if i > mid then
a[k] = aux[j]
j = j + 1
elseif j > hi then
a[k] = aux[i]
i = i + 1
elseif aux[j] < aux[i] then
a[k] = aux[j]
j = j + 1
else
a[k] = aux[i]
i = i + 1
end
end
for i,v in ipairs(a) do
print("num====",v)
end
end
local tab = {2,6,8,10,11,1,3,4,12,20}
merge(tab,1,#tab/2,#tab)
該方法首先將所有元素複製到aux[]中,然後再歸併回a[],方法在燴餅時進行四個判斷:左半邊用盡(取右半邊元素)、右半邊用盡(取左半邊元素)、右半邊的當前元素小於左半邊的當前元素(取右半邊的元素)及右半邊當前元素大於左半邊的當前元素(取左半邊的元素)。