可以看到這種結構很像一棵完全二叉樹,本文的歸併排序我們採用遞迴去實現(也可採用迭代的方式去實現)。分階段可以理解為就是遞迴拆分子序列的過程現在看一下治的階段我們需要將兩個已經有序的子串行合併成乙個有序序列,比如上圖中的最後一次合併,要將 [4,5,7,8] 和[1,2,3,6]兩個已經有序的子串行,合併為最終序列 [1,2,3,4,5,6,7,8],來看下實現步驟
;//歸併排序需要乙個額外空間
mergesort
(arr,
0, arr.length -
1, temp)
; system.out.
println
("排序後的結果為:"
+ arrays.
tostring
(arr));
}//分 + 合方法:先遞迴分,再合
public
static
void
mergesort
(int
arr,
int left,
int right,
int[
] temp)
}/**
* 合併的方法
* @param arr 待排序的原始陣列
* @param left 左邊有序序列的初始索引
* @param mid 中間索引
* @param right 右邊索引
* @param temp 做中轉的陣列
*/public
static
void
merge
(int
arr,
int left,
int mid,
int right,
int[
] temp)
else
}//(二)
//把有剩餘資料的一邊的資料依次全部填充到temp
while
( i <= mid)
while
( j <= right)
//(三)
//將temp陣列的元素拷貝到arr
//注意,並不是每次都拷貝所有,這句話和遞迴有關,要理解有一定的難度
//因為這裡並不是全部分完之後再合,而是分一點合一點
t =0;
int templeft = left;
////第一次合併 templeft = 0 , right = 1 // templeft = 2 right = 3 // tl=0 ri=3
//最後一次 templeft = 0 right = 7
while
(templeft <= right)
}}
package main
import
"fmt"
func
merge
(low [
]int
, high [
]int)[
]int
else
if low[left]
> high[right]
else
}if left <
len(low)
if right <
len(high)
return res
}func
mergesort
(arr [
]int)[
]int
else
}func
main()
fmt.
println
(mergesort
(arr)
)}
優化: 我們沒有必要把他切割到乙個然後合併,一般我們採用小於n個的時候用插入或者其他排序方法來提高排序效率
func
mergesort
(arr [
]int)[
]int
else
if length>
1&&length <
5else
}
排序演算法之歸併排序
歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...
排序演算法之歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。歸併排序基本原理 通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。歸併排序基本思...
排序演算法之歸併排序
歸併排序,和快排一樣同樣採用了分治的思想,將兩個 或以上 有序表合併成乙個新的有序表。歸併排序步驟如下 把n個記錄看成 n個長度為 1 的有序子表 進行兩兩歸併使記錄關鍵字有序,得到 n 2 個長度為 2 的有序子表 重複第2步直到所有記錄歸併成乙個長度為n的有序表為止。下面是歸併排序演算法的遞迴實...