//merge sort: int float32 float64//1 divide: 中分,僅存在一個變數時不分//2 merge: 合并子列,若一個子列為空白則//直接複製另外一個子列//fileName: mergeSort.gopackage mySort1import ( //"fmt" "log")//利用空介面實現任意類型,空介面類型不存在比較//比較需利用a.(int)將空介面類型斷言為具體類型//通過a.(type)可以判斷空介面的實際類型func MergeSort(arr []interface{}, low, high int) { desArr := make([]interface{}, high+1) if len(desArr) < 1 { log.Panicln(" short of memory") } mergeSort(arr, desArr, low, high)}func mergeSort(arr, desArr []interface{}, low, high int) { if len(arr) < 1 || len(desArr) < 1 || high > (len(arr)-1) || len(desArr) < len(arr) || (low > high) { log.Fatalf("func mergeSort: input error\n") } i, j := low, high if low < high { mid := (i + j) / 2 mergeSort(arr, desArr, i, mid) mergeSort(arr, desArr, mid+1, j) merge(arr, desArr, i, mid, mid+1, j) }}func merge(arr, desArr []interface{}, lowleft, highleft, lowright, highright int) { i1, j1, i2, j2 := lowleft, highleft, lowright, highright if len(arr) < 1 || len(desArr) < 1 || highright > (len(arr)-1) || len(desArr) < len(arr) || (highleft > lowright) || (lowleft > highleft) || (lowright > highright) { log.Fatalf("func merge: input error \n") } len := (j1 - i1) + (j2 - i2) + 2 var num int = 0 //merge for { if i1 > j1 || i2 > j2 { break } //判定待排序數群組類型 //待排序數組轉為相應類型並比較 //空介面無比較 if compare(arr[i1], arr[i2]) { desArr[num] = arr[i1] i1++ num++ } else { desArr[num] = arr[i2] i2++ num++ } } //copy if i1 <= j1 { copy(desArr[num:len], arr[i1:(j1+1)]) } if i2 <= j2 { copy(desArr[num:len], arr[i2:(j2+1)]) } //copy destArr to arr copy(arr[lowleft:(highright+1)], desArr[0:len])}//基於空介面的比較函數:目前適用於int float32 float64使用者可自行加入其他資料類型//比較空介面參數大小//用於mergeSort及其他排序演算法//fileName: compare.gopackage mySort1import ( "log")func compare(left, right interface{}) bool { switch left.(type) { //待排序數組轉為相應類型並比較 //空介面無比較 case int: //介面類型斷言 if left.(int) < right.(int) { return true } else { return false } case float32: if left.(float32) < right.(float32) { return true } else { return false } case float64: if left.(float64) < right.(float64) { return true } else { return false } default: log.Panicln("ilegal type: int float32 float64") } return false}//歸併排序用法樣本//mergeSort用法樣本//fileName: test.gopackage mainimport ( "fmt" "mySort1")func main() { //定義空介面數組 var arr = make([]interface{}, 6) //待排序數組 arr1 := []float32{4.1, 5.3, 8, 1, 3, 2} //空介面數組賦值 for i, _ := range arr { arr[i] = arr1[i] } fmt.Println("before: ", arr) mySort1.MergeSort(arr, 0, len(arr)-1) fmt.Println("after: ", arr)}
55 次點擊