0基礎入門資料結構與演算法 歸併排序

2021-10-02 09:14:48 字數 1475 閱讀 6002

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...