golang堆排序。利用堆排序选出10W条数据中前100大
话不多说,请直接看代码
注意:这里rand引入的包请使用crypto/rand,不要使用math/rand
package main
import (
"crypto/rand"
"fmt"
"math/big"
)
func createRand() int {
result, _ := rand.Int(rand.Reader, big.NewInt(100))
return int(result.Int64())
}
//建立最小堆
func minHeap(root int, end int, c []int) {
for {
var child = 2 * root + 1
//判断是否存在child节点
if child > end {
break
}
//判断右child是否存在,如果存在则和另外一个同级节点进行比较
if child + 1 <= end && c[child] > c[child + 1] {
child += 1
}
if c[root] > c[child] {
c[root], c[child] = c[child], c[root]
root = child
} else {
break
}
}
}
//建立大顶堆
func maxHeap(arr []int, root int, end int){
for{
var child = 2 * root + 1//右结点
if child > end {
break
}
if child + 1 <= end && arr[child] < arr[child + 1]{
child ++
}
if arr[child] > arr[root]{
arr[root], arr[child] = arr[child], arr[root]
root = child
}else {
break
}
}
}
//升序排序
func HeapAscSort(arr []int){
var n = len(arr) -1
for root := n / 2; root >= 0; root -- {
maxHeap(arr, root, n)
}
for i := n; i >= 0 ; i-- {
if arr[0] > arr[i]{
arr[0], arr[i] = arr[i], arr[0]
maxHeap(arr, 0, i-1)
}
}
}
//降序排序
func HeapDescSort(c []int) {
var n = len(c)-1
//遍历执行堆
for root := n / 2; root >= 0; root-- {
minHeap(root, n, c)
}
fmt.Println("堆构建完成")
for end := n; end >=0; end-- {
if c[0]<c[end]{
c[0], c[end] = c[end], c[0]
minHeap(0, end-1, c)
}
}
}
//选定指定范围内的值
func HeapSort(c []int,num int) []int {
m := len(c)-1//数组下标
createHeap(c[:num],num-1)
//fmt.Println("堆构建完成")
for i := num; i <=m; i++ {
//如果第i个元素大于所定堆最小的一个元素,那么就交换他们的位置,然后重新建立堆
if c[0]<c[i]{
c[0],c[i] = c[i],c[0]
createHeap(c[:num],num-1)
}
}
//fmt.Println(c[:num])
return c[:num]
}
//创建一个指定范围的小顶堆
func createHeap(arr []int,end int){
for start := end / 2; start >= 0; start-- {
minHeap(start, end, arr)
}
}
func main() {
arr := make([]int, 10)
for i := 0; i < len(arr); i++ {
arr[i] = createRand()
}
HeapAscSort(arr)
//HeapDescSort(arr)
//arrs := HeapSort(arr,100)
fmt.Println(arr)
}