Go语言用堆排序的方法进行一千万个int随机数排序.
发布时间:2020-12-16 18:41:54 所属栏目:大数据 来源:网络整理
导读:上篇文章用的是quicksort方法排序,但是如果用快速排序法对重复率很高的slice排序的时候,时间复杂度会激增,速度相当慢所以尝试了一下堆排序,实验结果,感觉挺好的.下面是代码,大家可以参考一下,这个是建立的大顶堆.二叉树的特性: 最后一个非叶子节点 : root =
上篇文章用的是quicksort方法排序,但是如果用快速排序法对重复率很高的slice排序的时候,时间复杂度会激增,速度相当慢 所以尝试了一下堆排序,实验结果,感觉挺好的.下面是代码,大家可以参考一下,这个是建立的大顶堆. 二叉树的特性: 最后一个非叶子节点 : root = length/2(当length为奇数的时候root向下取整) 在GO语言中的索引位置:root - 1,左右孩子节点:child_l = 2*root,索引位置:child_l-1,右孩子的节点: 2*root+1 索引位置. package main import ( "fmt" "math/rand" ) func main() { Num := 10000000 var list []int for i := Num; i > 0; i-- { list = append(list,rand.Intn(10000)) } //生成一千万个0---10000的随机数. length := len(list) for root := length/2 - 1; root >= 0; root-- { sort(list,root,length) } //第一次建立大顶堆 for i := length - 1; i >= 1; i-- { list[0],list[i] = list[i],list[0] sort(list,i) } //调整位置并建并从第一个root开始建堆.如果不明白为什么,大家多把图画几遍就应该明朗了 fmt.Println(list) } func sort(list []int,length int) { for { child := 2*root + 1 if child >= length { break } if child+1 < length && list[child] < list[child+1] { child++ //这里重点讲一下,就是调整堆的时候,以左右孩子为节点的堆可能也需要调整 } if list[root] > list[child] { return } list[root],list[child] = list[child],list[root] root = child } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |