php实现数据排序算法,PHP实现排序堆排序算法

这篇文章主要为大家详细介绍了PHP实现排序堆排序(Heap Sort)算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

算法引进:

在这里我直接引用《大话数据结构》里面的开头:

在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的记录需要比较 n - 1 次,本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否则如何知道他是最小的记录。

可惜的是,这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较重,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多。

如果可以做到每次在选择到最小记录的同时,并根据比较结果对其他记录做出相应的调整,那样排序的总体效率就会非常高了。而堆排序,就是对简单选择排序进行的一种改进,这种改进的效果是非常明显的。

基本思想:

在介绍堆排序之前,我们先来介绍一下堆:

《大话数据结构》里的定义:堆 是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,成为大顶堆(大根堆);或者每个节点的值都小于或等于其左右节点的值,成为小顶堆(小根堆)。

当时我在看到这里的时候也对有“堆是否是完全二叉树”有过疑问,网上也有说不是完全二叉树的,但是无论堆是不是完全二叉树,尚且保留意见。我们只要知道,在这里我们采用完全二叉树形式的大根堆(小跟堆),主要是为了方便存储和计算(后面我们会看到带来的便利)。

700882d7978cbcd0f348d3cdeef78146.png

堆排序算法:

堆排序就是利用堆(假设利用大根堆)进行排序的方法,它的基本思想是:将待排序的序列构造成一个大根堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的 n - 1 个序列重新构造成一个堆,这样就会得到 n 个元素中的次小的值。如此反复执行,便能得到一个有序序列了。

大根堆排序算法的基本操作:

①建堆,建堆是不断调整堆的过程,从 len/2 处开始调整,一直到第一个节点,此处 len 是堆中元素的个数。建堆的过程是线性的过程,从 len/2 到 0 处一直调用调整堆的过程,相当于 o(h1) + o(h2) …+ o(hlen/2) 其中 h 表示节点的深度, len/2 表示节点的个数,这是一个求和的过程,结果是线性的 O(n)。

②调整堆:调整堆在构建堆的过程中会用到,而且在堆排序过程中也会用到。利用的思想是比较节点i和它的孩子节点 left(i) , right(i),选出三者最大(或者最小)者,如果最大(小)值不是节点i而是它的一个孩子节点,那边交互节点i和该节点,然后再调用调整堆过程,这是一个递归的过程。调整堆的过程时间复杂度与堆的深度有关系,是 lgn 的操作,因为是沿着深度方向进行调整的。

③堆排序:堆排序是利用上面的两个过程来进行的。首先是根据元素构建堆。然后将堆的根节点取出(一般是与最后一个节点进行交换),将前面 len-1 个节点继续进行堆调整的过程,然后再将根节点取出,这样一直到所有节点都取出。堆排序过程的时间复杂度是 O(nlgn)。因为建堆的时间复杂度是 O(n)(调用一次);调整堆的时间复杂度是 lgn,调用了 n-1 次,所以堆排序的时间复杂度是 O(nlgn)。

在这个过程中是需要大量的图示才能看的明白的,但是我懒。。。。。。

算法实现:

//堆排序(对简单选择排序的改进)

function swap(array &$arr,$a,$b){

$temp = $arr[$a];

$arr[$a] = $arr[$b];

$arr[$b] = $temp;

}

//调整 $arr[$start]的关键字,使$arr[$start]、$arr[$start+1]、、、$arr[$end]成为一个大根堆(根节点最大的完全二叉树)

//注意这里节点 s 的左右孩子是 2*s + 1 和 2*s+2 (数组开始下标为 0 时)

function HeapAdjust(array &$arr,$start,$end){

$temp = $arr[$start];

//沿关键字较大的孩子节点向下筛选

//左右孩子计算(我这里数组开始下标识 0)

//左孩子2 * $start + 1,右孩子2 * $start + 2

for($j = 2 * $start + 1;$j <= $end;$j = 2 * $j + 1){

if($j != $end && $arr[$j] < $arr[$j + 1]){

$j ++; //转化为右孩子

}

if($temp >= $arr[$j]){

break; //已经满足大根堆

}

//将根节点设置为子节点的较大值

$arr[$start] = $arr[$j];

//继续往下

$start = $j;

}

$arr[$start] = $temp;

}

function HeapSort(array &$arr){

$count = count($arr);

//先将数组构造成大根堆(由于是完全二叉树,所以这里用floor($count/2)-1,下标小于或等于这数的节点都是有孩子的节点)

for($i = floor($count / 2) - 1;$i >= 0;$i --){

HeapAdjust($arr,$i,$count);

}

for($i = $count - 1;$i >= 0;$i --){

//将堆顶元素与最后一个元素交换,获取到最大元素(交换后的最后一个元素),将最大元素放到数组末尾

swap($arr,0,$i);

//经过交换,将最后一个元素(最大元素)脱离大根堆,并将未经排序的新树($arr[0...$i-1])重新调整为大根堆

HeapAdjust($arr,0,$i - 1);

}

}

$arr = array(9,1,5,8,3,7,4,6,2);

HeapSort($arr);

var_dump($arr);

时间复杂度分析:

它的运行时间只要是消耗在初始构建对和在重建堆屎的反复筛选上。

总体上来说,堆排序的时间复杂度是 O(nlogn)。由于堆排序对原始记录的排序状态并不敏感,因此它无论是最好、最差和平均时间复杂度都是 O(nlogn)。这在性能上显然要远远好于冒泡、简单选择、直接插入的 O(n^2) 的时间复杂度了。

堆排序是一种不稳定排序方法。

本篇博客参考自《大话数据结构》,在此仅作记录,方便以后查阅,大神勿喷!

您可能感兴趣的文章:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌Edge TPU:将机器学习引入边缘,撬动边缘计算/IOT大“地球”

近期&#xff0c;谷歌在Cloud Next会议上推出其最新产品&#xff0c;Edge TPU芯片和Cloud IOT Edge软件&#xff0c;并将于10月推出Edge TPU开发套件。作为Cloud TPU的补充&#xff0c;目前Edge TPU仅用于推理&#xff0c;专为在边缘运行TensorFlow Lite ML模型而设计。Edge TP…

详解云计算、大数据和人工智能的区别与联系

今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢&#xff1f;因为这三个东西现在非常火&#xff0c;并且它们之间好像互相有关系&#xff1a;一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成…

关于腾讯云丢数据事件的一些看法

事件回顾&#xff1a;创业公司“前沿数控”8月5日发文称&#xff0c;公司存放在腾讯云上的精准注册用户以及内容数据全部丢失&#xff0c;并且不能恢复&#xff0c;造成公司平台全部停运的状态。前沿数控表示&#xff0c;公司丢失的数据近千万元级&#xff0c;对此索赔1000余万…

Navicat for mysql备份与恢复

文章目录 一、Navicat for mysql备份1.打开navicat&#xff0c;找到备份2.点击新建备份&#xff0c;直接点备份3.备份完成 二、恢复数据1.删除表2.点击备份&#xff0c;选中备份文件&#xff0c;点击还原备份3.还原完成 三、其他命令四、视频演示总结 一、Navicat for mysql备份…

一文详解微服务架构的数据设计

微服务是一个软件架构模式&#xff0c;对微服务的讨论大多集中在容器或其他技术是否能很好的实施微服务这些方面。本文将从以下几个角度来和大家分享在微服务架构下进行数据设计需要关注的地方&#xff0c;旨在帮助大家在构建微服务架构时&#xff0c;提供一个数据方面的视角:什…

干货 | 数据分析的 7 个关键步骤是什么?

“数据科学家” 这个名号总让人联想到一个孤独的天才独自工作&#xff0c;将深奥的公式应用于大量的数据&#xff0c;从而探索出有用的见解。但这仅仅是数据分析过程中的一步。数据分析本身不是目标&#xff0c;目标是使企业能够做出更好的决策。数据科学家构建出的产品&#x…

Python 爬取了马蜂窝的出行数据,告诉你这个夏天哪里最值得去!

文章由数据森麟出品作者徐麟正值火辣的暑假&#xff0c;朋友圈已经被大家的旅行足迹刷屏了&#xff0c;真的十分惊叹于那些把全国所有省基本走遍的朋友们。与此同时&#xff0c;也就萌生了写篇旅行相关的内容&#xff0c;本次数据来源于一个对于爬虫十分友好的旅行攻略类网站&a…

如何让笨重的系统架构变灵巧?

图片来源&#xff1a;Unsplash作者丨徐贤军来源丨徐贤军 架构师技术联盟如需转载&#xff0c;请联系原作者授权随着业务的复杂性增大、系统吞吐量增长&#xff0c;所有功能统一部署难度加大&#xff0c;各个功能模块相互影响使系统变的笨重且脆弱&#xff0c;因此需要对业务进行…

透过日播放量超过6亿的《延禧攻略》,看2018视频网站格局

作者介绍徐麟目前就职于上海唯品会产品技术中心&#xff0c;哥大统计数据狗&#xff0c;从事数据挖掘&分析工作&#xff0c;喜欢用R&Python玩一些不一样的数据文章来源数据森麟如需转载&#xff0c;请联系原作者授权前言随着《延禧攻略》的播出&#xff0c;魏璎珞、富察…

oracle怎么以时间排序,oracle指定数据排序在前面怎么处理

最近工作碰到客户的特殊要求&#xff0c;需要将特定的数据排序在前面&#xff0c;然后才按时间顺序排序&#xff0c;这个之前还真没有碰到过&#xff0c;好在有万能的度娘&#xff0c;搜索了一下&#xff0c;发现可以实现&#xff0c;使用order by decode语句即可。对于order b…

如何优雅使用Docker?请收下这15个小技巧

图片来源&#xff1a;Unsplash作者介绍ElNinoT文章来源Java架构沉思录原文链接www.cnblogs.com/elnino/p/3899136.html如需转载&#xff0c;请联系原作者授权1获取最近运行容器的id 这是我们经常会用到的一个操作&#xff0c;按照官方示例&#xff0c;你可以这样做&#xff08;…

supervisor监控php进程程序,详解Supervisor进程守护监控(转)

Supervisor的配置2.0 创建目录&#xff0c;初始化配置文件mkdir /usr/supervisorecho_supervisord_conf > /usr/supervisor/supervisord.conf12mkdir/usr/supervisorecho_supervisord_conf>/usr/supervisor/supervisord.confecho_supervisord_conf详解&#xff1a;echo_s…

H264/ACC数据使用librtmp推流到服务器

这是本人第一次发表这个&#xff0c;首先声明本人也是个菜鸟&#xff01;都说使用librtmp很简单&#xff0c;但是在网上找了很久&#xff0c;还是被各种大神坑了。 其实我也还是有很多东西不懂&#xff0c;如果下面有什么问题的地方&#xff0c;还请各位大神指点纠正。 1.视频数…

从容器到微服务,技术架构、网络和生态详解

图片来源&#xff1a;Unsplash作者晗狄文章来源架构师技术联盟如需转载&#xff0c;请联系原作者授权谈起容器技术&#xff0c;不得不提Docker技术。Docker 是 PaaS 提供商 DotCloud 开源的一个高级容器引擎&#xff0c;源代码托管在 Github 上&#xff0c;基于Go语言并遵从Apa…

彻底搞懂 python 中文乱码问题

前言 曾几何时 Python 中文乱码的问题困扰了我很多很多年&#xff0c;每次出现中文乱码都要去网上搜索答案&#xff0c;虽然解决了当时遇到的问题但下次出现乱码的时候又会懵逼&#xff0c;究其原因还是知其然不知其所以然。现在有的小伙伴为了躲避中文乱码的问题甚至代码中不使…

如何让Kubernetes集群生产可用?

图片来源&#xff1a;veer本文作者Steven Wong (VMware)Michael Gasch (VMware)文章翻译Karen Lee文章来源K8S技术社区原文链接https://kubernetes.io/blog/2018/08/03/out-of-the-clouds-onto-the-ground-how-to-make-kubernetes-production-grade-anywhere如需转载&#xff0…

北京房租到底有多高? | 爬取北京海淀区一居室租房信息

图片来源&#xff1a;花瓣网文章来源人工智能与大数据生活如需转载&#xff0c;请联系原作者授权最近北京房租成了热门话题&#xff0c;到底北京的房租有多高&#xff1f;本次实战是爬取北京海淀区一居室的租房信息&#xff0c;共爬取了300套房源信息&#xff0c;看一下北京的房…

租房有深坑?手把手教你如何用R速读评论+科学选房

图片来源&#xff1a;网络编译Hope、臻臻、CoolBoy文章来源大数据文摘出品如有转载&#xff0c;请联系原作者。最近&#xff0c;租房这事儿成了北漂族的一大bug&#xff0c;要想租到称心如意的房子&#xff0c;不仅要眼明手快&#xff0c;还得看清各类“前辈”的评价避开大坑。…

快速搭建Python+Selenium+Sublime 自动化测试环境方法

随着业内越来越多的公司对自动化测试的大力推行&#xff0c;对测试人员能够使用自动化工具的要求也随之增多。为了能让更多的同事在学习selenium的初期&#xff0c;能够顺利的迈出第一步&#xff0c;即可以通过代码操作selenium driver 调用浏览器打开目标网址&#xff0c;笔者…

刚刚,百度总裁张亚勤说……

作者奋笔疾书的小编原创文章&#xff0c;如有转载&#xff0c;请联系本公众号。9月4日&#xff0c; ABC SUMMIT百度云智峰会在上海举行。百度总裁张亚勤首先发表《云计算的新浪潮》主题演讲&#xff0c;他表示&#xff0c;我们已经全面进入物理世界数字化、AI as a Service、新…