当前位置: 首页 > news >正文

49、PHP 实现堆排序

题目: PHP 实现堆排序

描述:

  • 堆排序
  • 基本思想:
  • 堆排序(HeapSort)是一树形选择排序。
  • 在排序过程中,将R[l…n]看成是一棵完全二叉树的顺序存储结构,
  • 利用完全二叉树中双亲结点和孩子结点之间的内在关系,
  • 在当前无序区中选择关键字最大(或最小)的记录。
  • 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。
  • 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆。
function heapSort(array $list){$length = count($list);buildHeap($list, $length - 1);while(--$length){$temp = $list[0];$list[0] = $list[$length];$list[$length] = $temp;heapAdjust($list, 0, $length);}return $list;
}function buildHeap(array &$list, $num){for($i = floor(($num - 1) / 2); $i >= 0; $i--){heapAdjust($list, $i, $num + 1);}
}function heapAdjust(array &$list, $i, $num){if($i > $num / 2){return ;}$key = $i;$leftChild = $i * 2 + 1;$rightChild = $i * 2 + 2;if ($leftChild < $num && $list[$leftChild] > $list[$key]) {$key = $leftChild;}if ($rightChild < $num && $list[$rightChild] > $list[$key]) {$key = $rightChild;}if ($key != $i) {$val = $list[$i];$list[$i] = $list[$key];$list[$key] = $val;heapAdjust($list, $key, $num);// heapPrint($list);}
}// function heapPrint(array $list){
// 	echo '<br>';
// 	echo 'Memory Structure:';
// 	echo '[ ' . implode(', ', $list) . ' ]';
// 	echo '<br>';
// 	echo 'Heap:';
// 	echo '<br>';
// 	$nbsp = '&nbsp;';
// 	$length = count($list);
// 	$level = ceil(sqrt($length));
// 	//start index
// 	for($j = 0; $j < $level; $j++){
// 		$startIndex = pow(2, $j) - 1;
// 		$endIndex = pow(2, $j) + $startIndex;
// 		for($i = $startIndex; $i < $endIndex; $i++){
// 			if($i < $length){
// 				echo $nbsp;
// 				echo $list[$i];
// 				echo $nbsp;
// 			}
// 		}
// 		echo '<br>';
// 	}
// }$list = array(3, 6, 2, 4, 10, 1 ,9, 8, 5, 7);
// heapPrint($list);
$result = heapSort($list);
// heapPrint($result);
var_dump($result);/*** 分析:* Memory Structure:[ 3, 6, 2, 4, 10, 1, 9, 8, 5, 7 ]* Heap:* 3 * 6  2 * 4  10  1  9 * 8  5  7 * * Memory Structure:[ 3, 6, 2, 8, 10, 1, 9, 4, 5, 7 ]* Heap:* 3 * 6  2 * 8  10 1  9 * 4  5  7 * Memory Structure:[ 3, 6, 9, 8, 10, 1, 2, 4, 5, 7 ]* Heap:* 3 * 6  9 * 8  10 1  2 * 4  5  7 * Memory Structure:[ 3, 10, 9, 8, 7, 1, 2, 4, 5, 6 ]* Heap:*  3 *  10  9 *  8  7  1  2 *  4  5  6 * Memory Structure:[ 3, 10, 9, 8, 7, 1, 2, 4, 5, 6 ]* Heap:*  3 *  10  9 *  8  7  1  2 *  4  5  6 * Memory Structure:[ 10, 8, 9, 5, 7, 1, 2, 4, 3, 6 ]* Heap:*  10 *  8  9 *  5  7  1  2 *  4  3  6 * Memory Structure:[ 10, 8, 9, 5, 7, 1, 2, 4, 3, 6 ]* Heap:*  10 *  8  9 *  5  7  1  2 *  4  3  6 * Memory Structure:[ 10, 8, 9, 5, 7, 1, 2, 4, 3, 6 ]* Heap:*  10 *  8  9 *  5  7  1  2 *  4  3  6 * Memory Structure:[ 9, 8, 6, 5, 7, 1, 2, 4, 3, 10 ]* Heap:*  9 *  8  6 *  5  7  1  2 *  4  3  10 * Memory Structure:[ 8, 7, 6, 5, 3, 1, 2, 4, 9, 10 ]* Heap:*  8 *  7  6 *  5  3  1  2 *  4  9  10 * Memory Structure:[ 8, 7, 6, 5, 3, 1, 2, 4, 9, 10 ]* Heap:*  8 *  7  6 *  5  3  1  2 *  4  9  10 * Memory Structure:[ 7, 5, 6, 4, 3, 1, 2, 8, 9, 10 ]* Heap:*  7 *  5  6 *  4  3  1  2 *  8  9  10 * Memory Structure:[ 7, 5, 6, 4, 3, 1, 2, 8, 9, 10 ]* Heap:*  7 *  5  6 *  4  3  1  2 *  8  9  10 * Memory Structure:[ 6, 5, 2, 4, 3, 1, 7, 8, 9, 10 ]* Heap:*  6 *  5  2 *  4  3  1  7 *  8  9  10 * Memory Structure:[ 5, 4, 2, 1, 3, 6, 7, 8, 9, 10 ]* Heap:*  5 *  4  2 *  1  3  6  7 *  8  9  10 * Memory Structure:[ 5, 4, 2, 1, 3, 6, 7, 8, 9, 10 ]* Heap:*  5 *  4  2 *  1  3  6  7 *  8  9  10 * Memory Structure:[ 4, 3, 2, 1, 5, 6, 7, 8, 9, 10 ]* Heap:*  4 *  3  2 *  1  5  6  7 *  8  9  10 * Memory Structure:[ 3, 1, 2, 4, 5, 6, 7, 8, 9, 10 ]* Heap:*  3 *  1  2 *  4  5  6  7 *  8  9  10 * Memory Structure:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]* Heap:*  1 *  2  3 *  4  5  6  7 *  8  9  10 */
http://www.lryc.cn/news/410149.html

相关文章:

  • 鸿蒙9+在TV端焦点封装控制
  • 操作系统课程设计:(JAVA)进程管理系统(附源码zip,jdk11,IDEA Ultimate2024 )
  • 机器学习 | 回归算法原理——随机梯度下降法
  • LeetCode 面试经典 150 题 | 位运算
  • postMessage 收到消息类型 “webpackWarnings“
  • 计算机基础(day1)
  • cesium添加流动线
  • 使用java自带的队列进行存取数据ArrayBlockingQueue 多线程读取ExecutorService
  • 【音视频之SDL2】Windows配置SDL2项目模板
  • JavaScript 里的深拷贝和浅拷贝
  • Oracle基础-集合
  • 《浅谈如何培养树立正确的人工智能伦理观念》
  • uniapp实现局域网(内网)中APP自动检测版本,弹窗提醒升级
  • 【Golang 面试 - 进阶题】每日 3 题(六)
  • Unity横板动作游戏 -项目准备
  • 基于Gunicorn + Flask + Docker的高并发部署策略
  • jdk版本管理利器-sdkman
  • Kafka知识总结(事务+数据存储+请求模型+常见场景)
  • C#中重写tospring方法
  • 【机器学习基础】机器学习的数学基础
  • fastapi之零
  • SpringBoot整合PowerJob 实现远程任务
  • 【扒模块】DFF
  • frameworks 之Socket
  • WEB前端开发中如何实现大文件上传?
  • ts给vue中props设置指定类型
  • 模拟实现c++中的list模版
  • 从信息论的角度看微博推荐算法
  • CISC(复杂指令集)与RISC(精简指令集)的区别
  • 自定义数据库连接的艺术:Laravel中配置多数据库连接详解