基於空介面的go語言歸併排序mergSort

來源:互聯網
上載者:User
//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 次點擊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.