1.堆(二叉堆):可以视为一棵完全的二叉树,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素
2.给出某个结点的下标,可以计算出父结点的和孩子结点的下标; parent(i)=floor(i/2) left(i)=2i right=2i+1
3.最大堆和最小堆,最大堆:根结点是最大值,最小堆:根结点是最小值
4.堆排序就是把最大堆堆顶的最大数取出,剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,直到剩余数只有一个结束
5.最大堆调整(维护最大堆,子节点永远小于父结点) ;创建最大堆(把一个数组调整成最大堆的数组);堆排序(创建最大堆,交换,维护最大堆)
maxHeapify (array,index,heapSize) //最大堆调整
iMax,iLeft,iRight
while true
iMax=index;iLeft=2*index+1;iRight=2*index+2
如果根结点小于左右子树里结点值,就交换一下这两个值
利用第三方变量,交换下两个值
buildMaxHeap(array) //创建最大堆,把一个数组调整成最大堆的数组
iParent=floor((size-1)/2)
for i=iParent;i>=0;i--
maxHeapify (array,i,size)
sort(arr)
buildMaxHeap(array, heapSize);//创建最大堆
for (int i = heapSize - 1; i > 0; i--) {
swap(array, 0, i); //交换第一个和最后一个
maxHeapify(array, 0, i);//维护最大堆,size小了一个
//交换元素
function swap(&$arr,$a,$b){
$temp=$arr[$a];
$arr[$a]=$arr[$b];
$arr[$b]=$temp;
}
//排序的入口函数
function heapSort(&$arr){
$heapSize=count($arr);
buildMaxHeap($arr, $heapSize);//创建最大堆
for ($i = $heapSize - 1; $i > 0; $i--) {
swap($arr,0,$i); //交换第一个和最后一个
maxHeapify($arr, 0, $i);//维护最大堆,size小了一个
}
}
//创建最大堆的函数
function buildMaxHeap(&$arr, $heapSize){
$iParent=floor(($heapSize-1)/2);//根据最后一个元素的索引值计算该结点根结点的索引是哪个
for($i=$iParent;$i>=0;$i--){//这个循环是循环的所有根结点
maxHeapify($arr,$i,$heapSize);//维护最大堆
}
}
//维护最大堆
function maxHeapify(&$arr,$index,$heapSize){
$iMax=0;$iLeft=0;$iRight=0;
while(true){
$iMax=$index;
$iLeft=2*$iMax+1;
$iRight=2*$iMax+2;
if($iLeft<$heapSize && $arr[$iLeft]>$arr[$iMax]){
$iMax=$iLeft;
}
if($iRight<$heapSize && $arr[$iRight]>$arr[$iMax]){
$iMax=$iRight;
}
if($iMax!=$index){
swap($arr,$index,$iMax);
$index=$iMax;
}else{
break;
}
}
}
$arr=array(2,1,3,5,9,6);
heapSort($arr);
var_dump($arr);

[PHP]算法-堆排序的PHP实现的更多相关文章

  1. 使用 js 实现十大排序算法: 堆排序

    使用 js 实现十大排序算法: 堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列: 小顶堆:每个 ...

  2. 算法----堆排序(heap sort)

    堆排序是利用堆进行排序的高效算法,其能实现O(NlogN)的排序时间复杂度,详细算法分析能够点击堆排序算法时间复杂度分析. 算法实现: 调整堆: void sort::sink(int* a, con ...

  3. 数据结构与算法---堆排序(Heap sort)

    堆排序基本介绍 1.堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序. 2.堆是具有以下性质的完全二叉树:每个 ...

  4. JavaScript排序算法——堆排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 八大排序算法——堆排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演示 二.思路分析 先来了解下堆的相关概念:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如 ...

  6. Java排序算法——堆排序

    堆排序 package sort; public class Heap_Sort { public static void main(String[] args) { // TODO 自动生成的方法存 ...

  7. 排序算法-堆排序(Java)

    package com.rao.linkList; import java.util.Arrays; /** * @author Srao * @className HeapSort * @date ...

  8. Java算法-堆排序

    package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; public class HeapSor ...

  9. java数据结构和算法------堆排序

    package iYou.neugle.sort; public class Heap_sort { public static void HeapSort(double[] array) { for ...

随机推荐

  1. mysql客户端连不上数据库

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; flush privileges ...

  2. vue的学习之路

    一.vs code中,适合vue的前端插件 查看网址:http://blog.csdn.net/caijunfen/article/details/78749766 二.如何使用git从gitub上拉 ...

  3. 关于Selenium WebDriver的geckodriver

    下载Selenium的最新版本地址:http://selenium-release.storage.googleapis.com/index.html 友情提示:如果一直下载不了,可能是浏览器与下载工 ...

  4. C++ 一些特性

    1.  初始化列表std::initializer_list,头文件<initializer_list> C++11提供了模板类template<class T> class ...

  5. Spring+Redis集成+关系型数据库持久化

    本篇文章主要介绍了"Spring+Redis集成+关系型数据库持久化",主要涉及到Spring+Redis集成+关系型数据库持久化方面的内容,对于Spring+Redis集成+关系 ...

  6. QQ的成功,远没有你想象的那么顺利和轻松

    本文来自公众号“傅老师”(ID:fustory)的原创分享,感谢作者. 1.引言 如果QQ是一个人,看似风光,其实从出生到成长,过程饱经错荡,堪算坎坷.它的人生历程确实也够励志的了.   学习交流: ...

  7. Android自定义控件总结

    自定义控件分类: 1.使用系统控件,实现自定义的效果 2.自己定义一个类继承View ,如textView.ImageView等,通过重写相关的方法来实现新的效果 3.自己定义一个类继承ViewGro ...

  8. Spark基础-scala学习(八、隐式转换与隐式参数)

    大纲 隐式转换 使用隐式转换加强现有类型 导入隐式转换函数 隐式转换的发生时机 隐式参数 隐式转换 要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可.Scala会自动使用隐式转换函数.隐式转换 ...

  9. PyTorch--双向递归神经网络(B-RNN)概念,源码分析

    关于概念: BRNN连接两个相反的隐藏层到同一个输出.基于生成性深度学习,输出层能够同时的从前向和后向接收信息.该架构是1997年被Schuster和Paliwal提出的.引入BRNNS是为了增加网络 ...

  10. Xamarin.Android 使用 SimpleAdapter 打造 ListView 万能适配器

    第一步:创建 layout1.axml 来展示列表详细内容 <?xml version="1.0" encoding="utf-8"?> <L ...