2020 06 08 手寫歸併排序

2022-06-09 14:57:11 字數 1503 閱讀 1381

福哥答案2020-06-08:

golang**如下:

package test20_mergersort

import (

"fmt"

"testing")

//go test -v -test.run testmergersort

func testmergersort(t *testing.t)

fmt.println(arr)

mergersort_mycode(arr, 0, len(arr))

fmt.println(arr)

}fmt.println("-----------------")

if true

fmt.println(arr)

mergersort_copycode(arr, 0, len(arr))

fmt.println(arr)

}} // mergersort_mycode自己寫的** 步驟:1.判斷長度是否大於1;2.取中值;3.遞迴排序兩個;4.迴圈左陣列,如果逆序,交換並氣泡排序右陣列一次。

func mergersort_mycode(arr int, left, right int)

mid := left + (right-left)>>1 //取中值不會溢位

mergersort_mycode(arr, left, mid) //左排序

mergersort_mycode(arr, mid, right) //右排序

for i := left; i < mid; i++ else }}

}} // mergersort_copycode網上覆制的**

func mergersort_copycode(arr int, left, right int)

//c := (a + b) / 2 //取中值可能溢位

mid := left + (right-left)>>1 //取中值不會溢位

mergersort_copycode(arr, left, mid) //左排序

mergersort_copycode(arr, mid, right) //右排序

arrleft := make(int, mid-left)

arrright := make(int, right-mid)

copy(arrleft, arr[left:mid]) //複製陣列左邊

copy(arrright, arr[mid:right]) //複製陣列右邊

i := 0

j := 0

for k := left; k < right; k++ else if j >= right-mid else if arrleft[i] <= arrright[j] else }}

敲go test -v -test.run testmergersort結果如下:

手寫堆排序和歸併排序

手動實現堆排序,使用大根堆實現 從小到大排序 完成在陣列 low,high 的範圍內,對在位置low上的節點向下進行調整 void shift int nums,int low,int high else break nums i tmp void heap sort int nums,int n ...

Syins寫的歸併排序

歸併排序使用了分治思想 對乙個陣列排序,先將陣列分成左邊和右邊兩個子塊,然後繼續分子塊到乙個子塊只包含乙個數再返回 voidst int a,int lo,int hi 再通過mg函式將子塊有序合併,這裡採用的是有序數列的合併思想 voidmg int a,int lo,int mi,int hi ...

c語言寫歸併排序

歸併排序,在實際開發中,很少用,但是為什麼一定要掌握它,甚至在面試中經常會問到。其實,只是為了更好的理解演算法。歸併排序最核心的就是分治策略,所謂分治,就是把乙個問題,拆分成若干個小問題然後求解。掌握歸併排序以後,在遇到更複雜的問題,我們可以考慮分治策略。歸併排序是穩定的,時間複雜度是o nlogn...