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…

matlab实验函数编写与程序设计,matlab实验四函数编写与程序设计

《matlab实验四函数编写与程序设计》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《matlab实验四函数编写与程序设计(8页珍藏版)》请在金锄头文库上搜索。1、实验四&#xff1a;函数编写与程序设计一、实验目的 1 . 掌握 M 文件的创建。2掌握函数的编写规则。3掌握函…

eclipse运行java快捷键,eclipse常用快捷键

eclipse常用快捷键eclipse 常用快捷键Eclipse的编辑功能非常强大&#xff0c;掌握了Eclipse快捷键功能&#xff0c;能够大大提高开发效率。Eclipse中有如下一些和编辑相关的快捷键。1. 【ALT/】此快捷键为用户编辑的好帮手&#xff0c;能为用户提供内容的辅助&#xff0c;不要为…

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

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

php phar包require报错,php,_很奇怪,php 引入了phar,但是报错,说Predis\Client类找不到?,php - phpStudy...

很奇怪&#xff0c;php 引入了phar&#xff0c;但是报错&#xff0c;说Predis\Client类找不到&#xff1f;require Predis.phar;use Predis\Client;ini_set(session.save_path, tcp://localhost:6379);ini_set(session.name, YMFSESSION);ini_set(session.save_handler, user);…

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

事件回顾&#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备份…

java mysql order by,java-使用LIMIT和MySQL进行ORDER BY

我在使用MySQL查询时遇到问题,在该查询中我得到了一个带有LIMIT 1的行.但是,将其与order一起使用时,它不起作用.在mysql工作台中运行的查询如下&#xff1a;select * from train twhere t.togId 1125and t.tilDato > 2013-12-20order by t.fraDato LIMIT 1;但是,当我通过ja…

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

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

java 不支持fork,grails不能运行fork模式解决方法

升级到grails 2.3.2之后,运行时报如下的异常:Exception in thread "main"Error |Forked Grails VM exited with errorjava.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/…

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

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

java中挂起和恢复,应用程序“未能及时恢复”并挂起

事件标识符&#xff1a;6C33511B-7C9A-474C-B888-84A4FAFF6F91 CrashReporter密钥&#xff1a;93bbba4f690eb1b7638fa7a09a3ff3aa4e6872f4硬件型号&#xff1a;iPad2,1过程&#xff1a;Designer [5279]路径&#xff1a;/ var / mobile / Applications / 7AA5BF4A-007D-47F8-B1C…

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

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

谢华亮 php,谢华亮: PHP4和PHP5性能测试和对比

PHP 4到今年年底PHP Group将不再对其进行支持了&#xff0c;所以为了让大家更有信心的转移到PHP 5平台上&#xff0c;我特别做了这个测试&#xff0c;看看我们PHP 4.x 是否真的性能比我们的PHP 5.x要好&#xff0c;测试结果很明显&#xff0c;那就是PHP 5.x 比php 4.x不论是面向…

oracle rman 检查坏块,Oracle中使用RMAN来检验坏块

RMAN即recovery manager可以通过在执行的备份任务中&#xff0c;仅仅验证数据文件中的数据块而不生成实际的备份&#xff0c;这样做的目的是纯粹为了了解数据文件中是否有坏块。RMAN在这个环境中&#xff1a;验证数据文件是否存在数据文件位于正确的存放位置在RMAN尝试检验这些…

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

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

php ios 判断字符串长度,iOStextfield 限制输入字符长度和过滤表情符号

//增加修改框-(void)creatSaveView{UILabel * lab [[UILabel alloc]init];if (self.searchType 1) {lab.frame CGRectMake(14, 8 * KWIDTH 64, IPHONE_WIDTH - 100, 16 *KWIDTH);}else{lab.frame CGRectMake(14, 8 * KWIDTH, IPHONE_WIDTH - 100, 16 * KWIDTH);}lab.text …

约稿——码字能赢得百万人生?不开玩笑

2018是写作的风口。你不信&#xff1f;你不能写&#xff1f;我们来看看人们是如何写作的——其实人人都能写。绝望中靠写作赢回人生&#xff0c;并且财务自由2015年&#xff0c;夏知凉遭遇生意破产和朋友背叛&#xff0c;负债几十万的他&#xff0c;电脑都被拿去抵债&#xff0…

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

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

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

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