2.3. **片段 - 自底向上
現在讓我帶領大家看看怎麼實現的吧!
乙個時間效能比較好的排序方法,但是它的空間複雜度較高t(n)
通過遞迴將陣列一直切割直至為將陣列分成兩兩一組。排序完成之後往上層回溯,此時變成四四一組…重複上述過程直到遞迴結束。
歸併排序動畫演示
2.2.1.**片段
func
mergesort
(arr [
]int
)func
mergesort
(arr [
]int
, l, r int
) mid := l +
(r-l)/2
//公認防止整形溢位的寫法。
mergesort
(arr, l, mid)
//分割左邊的陣列
mergesort
(arr, mid+
1, r)
//分割右邊的陣列
_mergesort
(arr, l, mid, r)
//在最底層往上開始處理資料
}func
_mergesort
(arr [
]int
, l, mid, r int
) arrtemp :=
make([
]int
,len
(arr[l : r+1]
))copy
(arrtemp, arr[l:r+1]
)//拷貝乙份陣列
i := l
j := mid +
1//這裡的i和j分別是兩個陣列的起點。
for k := l; k <= r; k++
else
if j > r
else
if arrtemp[i-l]
<= arrtemp[j-l]
else
}}
2.2.2. **解釋
歸併過程中,拷貝乙份此區間的陣列。然後通過比對這個陣列的左右兩邊依次將較小的資料賦值給原陣列。此時這份分割後的陣列就是排序完成的。
加入了優化**arr[mid+1] > arr[mid]此時陣列已經有序不需要再進行操作。
2.3.1. **片段
func
mergesortbottomup
(arr [
]int)}
}
2.3.2. **解釋
_mergesort() 的**與自頂向下的方法一樣。
本質上for迴圈僅僅是模擬了遞迴過程中,將陣列切分開的元素位置。
需要主要的是右邊界的問題,因為陣列可能是無法剛好分割成整數的,所有在個別情況下應當只能取到陣列的最大長度。
???製作動畫過程不易,煩請大家順手點讚收藏咯 ???
資料結構與演算法 歸併排序
include include include string include include include include algorithm using namespace std void merge vector input,int left,int mid,int right,vector...
資料結構與演算法(歸併排序)
歸併排序是採用分治法的乙個典型的應用,歸併排序的思想就是先遞迴分解陣列,在合併陣列。將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的前面的數,誰小就先取誰,取了後相應的指標就往後移一位,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。def merge sort alis...
資料結構與演算法 歸併排序
你可以在 的 mer 標籤中看到歸併排序的動畫。歸併排序 時間複雜度 o nlogn 空間複雜度 o n 基本思想 分治思想。8 6 2 3 1 5 7 4 分 8 6 2 3 1 5 7 4 分 8 6 2 3 1 5 7 4 分 8 6 2 3 1 5 7 4 並 8 6 2 3 1 5 7 4...