首页 > 编程语言 >【算法-堆排序】Go语言实现

【算法-堆排序】Go语言实现

时间:2023-01-22 15:55:11浏览次数:54  
标签:index arr int max 堆排序 算法 Go 节点 size

堆排序

通过数组构造堆,
根节点是最大的元素 是大根堆,相反为小根堆
主要有俩个方法,插入 InsertHeap , 调整 堆: heapify

对于排序来说:先把数组构造成一个大根堆,然后[0] 依次和最后的元素交换。直到0.这样就排好序了。
image
image

package basicsort

import "fmt"

func HeapSort(arr []int) {
	//构造堆
	for i := 0; i < len(arr); i++ {
		InsertHeap(arr, i)
	}

	fmt.Println(arr)
	// 开始把最大值依次替换到后面

	size := len(arr) // 记录当前堆的大小

	for i := len(arr) - 1; i > 0; i-- {
		swap(arr, 0, i)
		fmt.Println(i, arr)
		size-- //堆的大小减一
		//[0] 和最后一个数替换,当前堆已经不是大根堆了。要调整。
		heapify(arr, size)
		fmt.Println(i, arr)
	}
}

func InsertHeap(arr []int, index int) {
	//插入堆
	for arr[index] > arr[(index-1)/2] {
		//如果自己比自己的父节点大,那么就交换
		swap(arr, index, (index-1)/2)
		index = (index - 1) / 2 //更新index的值

	}
}

func heapify(arr []int, size int) {

	for i := 0; i < size; {
		// 判断自己和自己的左右节点 谁大,
		//先判断 是否存在 左右节点,超过堆大小就不是了。
		max_index := i //保存最大值的索引
		//这里是小于,不是小于等于。 比如 size 是 9 ,但是索引到8 。。
		if i*2+1 < size && arr[i*2+1] > arr[max_index] {
			//左子节点存在,并且比父节点大,更新max_index
			max_index = i*2 + 1
		}

		if i*2+2 < size && arr[i*2+2] > arr[max_index] {
			//右子节点存在, 更新max_index
			max_index = i*2 + 2
		}

		// 结束条件: i就是max_index
		if i == max_index {
			break
		}
		//交换
		swap(arr, i, max_index)
		i = max_index // 更新i的值。
	}
}

堆排序扩展

对一个几乎有序的数组,几乎有序指的是:每个元素移动到正确的位置不超过k.请选择一个合适的排序算法

1)先把k个元素 入堆。
2)再次入堆的时候,就要弹出元素了
3)如果堆中还有剩余元素,依次弹出

后面补充。。代码

标签:index,arr,int,max,堆排序,算法,Go,节点,size
From: https://www.cnblogs.com/clllll/p/17064475.html

相关文章

  • 1582_C代码实现的快速、可移植MD5信息摘要算法
    全部学习汇总:​​GreyZhang/c_units:Asmallpieceofcodewhichcanbereuseanywhere,Icallitaunit.ThisisacollectionofunitinClanguage!Ok,yes,it......
  • 11 break、continue、goto
    #break、continue、gotopackagecom.zhan.base_2;publicclassTest11{publicstaticvoidmain(String[]args){//continue语句:跳出本次循环,直......
  • 归并排序和快速排序补充扩展-Go语言
    基于堆排序的算法题小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。就是在合并的时候,当左边数组的数小于右边数组的......
  • 你知道哈希算法,但你知道一致性哈希吗?
    前言假如让你为淘宝这种数据量非常大的公司的设计一个可扩展的数据存储系统,你该如何存储和管理数据呢?总不能放在单个服务器上吧,肯定放不下,必然需要水平扩展。那么这样就带......
  • A. Everybody Likes Good Arrays!【Codeforces Round #845 (Div. 2) 】
    A.EverybodyLikesGoodArrays!原题链接Anarrayaisgoodifforallpairsofadjacentelements【相邻元素】,aiandai+1(1≤i<n)areofdifferentparity【奇......
  • 代码随想录算法训练营第24天
    今日刷题1道:学习回溯算法的理论基础+组合。理论基础: 题目链接/文章讲解:https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9......
  • go语言学习笔记【一】
    一、初入GO语言我们先还是看看GO语言的helloworld是怎么写的吧packagemainimport"fmt"funcmain(){fmt.Println("Helloworld!")}第一行:包声明,编写源文件时,必须......
  • sql base nodejs py go操作基本的db
    constmysql=require('mysql2');constconnection=mysql.createConnection({host:'localhost',user:'root',password:'root',database:'mybatis_pl......
  • 模拟退火算法
    eg1:LeecodeclassSolution{public:intmaxHappyGroups(intbatchSize,vector<int>&groups){w=groups;n=w.size();m=batchS......
  • Django书籍学习记录
    没有记录回顾的学习都是白学,那天偶尔搜到这本书,其中除了一部分官网的中文翻译,还有一些没有了解到的地方,比如模型查询filter的链式调用,Q.F方法在定义化SQL中起到的作......