堆排序(php实现)
堆排序基本步骤:
1:把无序序列构成一个堆。
2:交换堆顶元素和最后一个元素,交换之后由于堆结构破坏,重置堆。
初始化堆和交换后的重置堆区别在于:初始化堆时从最后一个非叶子结点开始调整结点位子,交换堆顶元素后的重置只需要调节堆顶元素的位子。
<?php
/**
* 堆排序
*/ function heapSort($arr){
$len = count($arr);
initHeap($arr);//初始化堆
for($end=$len-1;$end>0;$end--){//交换堆顶和最后的一个元素
$tmp = $arr[$end];
$arr[$end] = $arr[0];
$arr[0] = $tmp; //调整堆,堆顶元素破坏了堆结构
adjustHeap($arr,0,$end-1);//$end-1
}
return $arr;
} function initHeap(&$arr){
$len = count($arr);
//最后一个非叶子节点开始,到根节点
for($start=floor($len/2)-1;$start>=0;$start--){
adjustHeap($arr,$start,$len-1);
}
} /*
* $arr 待调整数组
* $start 待调整节点的下标(区别于在二叉树中编号,-1)
* $end 结束下标
*/
function adjustHeap(&$arr,$start,$end){
$max = $start;
$lchild_index = 2*($start+1)-1;
$rchild_index = 2*($start+1); if($lchild_index<=$end){
if($arr[$lchild_index]>$arr[$max]){
$max = $lchild_index;
} if($rchild_index<=$end&&$arr[$rchild_index]>$arr[$max]){
$max = $rchild_index;
} } if($max !=$start){
$tmp = $arr[$start];
$arr[$start] = $arr[$max];
$arr[$max] = $tmp; adjustHeap($arr, $max, $end);
}
} $arr = array(2,4,5,2,4,6,3,1,2,7,8);
echo count($arr);
print_r(heapSort($arr));
?>
堆排序(php实现)的更多相关文章
- 算法与数据结构(十四) 堆排序 (Swift 3.0版)
上篇博客主要讲了冒泡排序.插入排序.希尔排序以及选择排序.本篇博客就来讲一下堆排序(Heap Sort).看到堆排序这个名字我们就应该知道这种排序方式的特点,就是利用堆来讲我们的序列进行排序.&quo ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序
#!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序 重点的地方:小堆序 ...
- 堆排序(python实现)
堆排序是利用最大最或最小堆,废话不多说: 先给出几个概念: 二叉树:二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树” 完全二叉树:除最后一层外, ...
- 堆排序分析及php实现
堆排序:是一种特殊形式的选择排序,他是简单选择排序的一种改进. 什么是堆? 具有n个元素的序列:{k1,k2,ki,…,kn} (ki <= k2i,ki <= k2i+1) 或者 (ki ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)
[Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...
- PHP实现堆排序
经验 工作了,面试我工作这家公司时被技术面打击得不行,因为自己的数据结构等基础学得实在太差,虽然原来是想做设计师的说...不过看在PHP写得还凑合的份上能来实习了,但还是决心恶补一下基础. 其实自己之 ...
- 堆排序 Heapsort
Prime + Heap 简直神了 时间优化好多,顺便就把Heapsort给撸了一发 具体看图 Heapsort利用完全二叉树+大(小)顶锥的结构每次将锥定元素和锥最末尾的元素交换 同时大(小)顶锥元 ...
随机推荐
- 13.Promise 对象
Promise 对象 Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其 ...
- Unity主线程和子线程跳转调用(2)
在上一篇介绍了多线程和Unity交互方式,但是由于我的项目是一个unity编辑器插件项目,很显然上一篇的代码需要加以修改,在编辑器下实现Loom. 1,Editor下的没有Update这个生命周期函数 ...
- Linux系统修改Mysql密码
一.拥有原来的myql的root的密码: 方法一: 在mysql系统外,使用mysqladmin mysqladmin -u root -p password "test123" ...
- 通过微信分享链接,后面被加上from=singlemessage&isappinstalled=1导致网页打不开
微信分享会根据分享的不同,为原始链接拼接如下参数: 朋友圈 from=timeline&isappinstalled=0微信群 from=groupmessage&isappi ...
- 用python实现一个简单的聊天功能,tcp,udp,socketserver版本
基于tcp协议版本 服务器端 import socket server = socket.socket() server.bind(('127.0.0.1', 8001)) server.listen ...
- 连接数据库 JDBC、DBCP、JNDI
一.JDBC package com.direct.util; import java.sql.Connection; import java.sql.DriverManager; import ja ...
- c#中表达式的返回值是啥?
今天在学javascript的时候发现它其中有一个语法是这样的(a="haha).length;这样也能够输出haha这个字符串的长度,然而我在使用c#的时候分行读取txt文本的时候也用这个 ...
- mysql_real_escape_string与mysqli_real_escape_string
参考 mysql_real_escape_string mysqli_real_escape_string mysql_real_escape_string是用来转义字符的,主要是转义POST或GE ...
- thinkPHP3.2.2 控制器内跳转的三种方式
public function jump() { $obj = new TestController(); $obj->logged(); } public function jump1() { ...
- ASP.NET SignalR-B.S/C.S 相互打通DEMO
ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信. 什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知 ...