基于空接口的go语言归并排序mergSort

栏目: Go · 发布时间: 6年前

//merge sort: int float32 float64 //1 divide: 中分,仅存在一个变量时不分 //2 merge: 合并子列,若一个子列为空则 //直接复制另外一个子列 //3 需要与待 排序 数组等大小数组 //fileName: mergeSort.go package mySort1 import ( //"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.go package mySort1 import ( "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.go package main import ( "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) }


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

链接

链接

[美]艾伯特-拉斯洛•巴拉巴西 (Albert-László Barabási) / 沈华伟 / 浙江人民出版社 / 2013-8-1 / 59.90元

[内容简介] ★《链接》是《爆发》的作者,艾伯特-拉斯洛•巴拉巴西的成名之作,同时也是复杂网络的奠基之作,社交网络的入门之作。巴拉巴西之前,随机网络理论一直主导者我们的网络思维,是巴拉巴西第一个证明了,我们不是生活在随机世界里,真实网络是无尺度的。 ★巴拉巴西在书中追溯了网络的数学起源,分析了社会学家在此基础上得出的研究成果,最后提出自己的观点:我们周围的复杂网络,从鸡尾酒会、恐怖组织......一起来看看 《链接》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器