堆排序。利用堆排序选出10W条数据中前100大

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)
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值