zoukankan      html  css  js  c++  java
  • 用golang刷算法--堆排序算法

    堆排序算法流程

    将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

    大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]

    小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

    用golang实现

    func HeapSort(intList []int) {
    	end := len(intList) - 1
    	for end >= 0{
    		heap(intList, end)
    		intList[0], intList[end] = intList[end], intList[0]
    		end--
    	}
    }
    
    func heap(intList []int, end int) {
    	i := end
    	// 判断end是否是奇数
    	if end%2 == 1 {
    		// 比较end和其父亲的大小
    		if intList[end] > intList[(end-1)/2] {
    			// 和父亲交换位置
    			intList[end], intList[(end-1)/2] = intList[(end-1)/2], intList[end]
    		}
    		i = end - 1
    	}
    	for ; i > 0; i -= 2 {
    		// 判断孩子和父亲的大小
    		father := intList[(i-2)/2]
    		leftChild := intList[i-1]
    		rightChild := intList[i]
    		maxIndex := i // 两个孩子中大的一个的下标
    		if leftChild > rightChild{
    			maxIndex = i-1
    		}
    		if father < intList[maxIndex] {
    			intList[(i-2)/2], intList[maxIndex] = intList[maxIndex], intList[(i-2)/2]
    		}
    	}
    }
    
  • 相关阅读:
    无符合条件的记录,SUM函数返回NULL。返回0而不是Null
    Java中的堆栈,队列,链表
    Java集合类的问题
    2014.7.30日结
    我的CSS之路1
    2014.7.27-7.28日结
    LeetCode解题源代码链接集锦一
    2014.7.23日结
    C++之数组声明与初始化
    系统结构之指令
  • 原文地址:https://www.cnblogs.com/kainhuck/p/12972395.html
Copyright © 2011-2022 走看看