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. LeetCode刷题:第一题 两数之和

    从今天开始刷LeetCode 第一题:两数之和 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种 ...

  2. 关于NGUI Shader 和 Draw Call的优化 & 模糊shader

    序: 1.项目过程中不可避免的需要用到大量Shader 和 UITexture,由于Ngui对Shader支持非常糟糕,导致项目drawCall异常的高 2.Panel裁剪无法裁剪自定义shader内 ...

  3. Android插件化的兼容性(上):Android O的适配

    首先声明,<Android插件化开发指南>这本书所介绍的Android底层是基于Android6.0(API level 23)的,而本书介绍的各种插件化解决方案,以及配套的70多个例子, ...

  4. jquery mobile Touch事件

    Touch事件在用户触摸屏幕(页面)时触发 1.jquery mobile tap tap事件在用户敲击某个元素时触发 $("p").on("tap",fucn ...

  5. Android JNI 学习(七):Accessing Fields Api

    一.GetFieldID jfieldIDGetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig); 返回类的实 ...

  6. shell脚本执行错误 $'\r':command not found

    shell脚本执行错误 $'\r':command not found Linux下有命令dos2unix 可以用一下命令测试 vi -b filename 我们只要输入dos2unix *.sh就可 ...

  7. Javascript高级编程学习笔记(74)—— 表单(2)表单提交及重置

    表单提交 表单的很大一部分作用就是帮助用户完成和服务器的交互 所以表单提交是表单中比较重要的部分 虽然现如今的大部分应用场景都使用 AJAX 的异步请求来代替表单,但是仍有部分操作需要使用表单来完成, ...

  8. python写的压缩软件

    import tkinterimport tkinter.filedialogimport osimport zipfileimport tkinter.messagebox #创建住窗口root = ...

  9. linux下postgres的安装

    软件包的下载 在浏览器中访问https://www.enterprisedb.com/download-postgresql-binaries 然后选择适合自己的版本,我选择的是linux64位下的1 ...

  10. Spark基础-scala学习(二、面向对象)

    面向对象编程之类 //定义一个简单的类 scala> :paste // Entering paste mode (ctrl-D to finish) //类默认public的 class He ...