php中堆排序的实现原理是什么

介绍

这篇文章将为大家详细讲解有关php中堆排序的实现原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

这里以php作为描述语言较详细讲解堆排序原理,因保证程序可读性,故不做优化,php程序中关于堆的一些概念如下:

假设n为当前数组的关键则,n的父节点为n>在1或者n/2(整除);n的左子节点l=n<& lt; 1或l=n * 2, n的右子节点r=(n<& lt; 1) + 1或r=l + 1

$ arr=数组(1、8、7、2、3、4、6、5、9),

数美元组arr的原形态结构如下:

,,,,,,,,,,,,1
,,,,,,,,,,/,,,
,,,,,,,,8日,,,,,7
,,,,,,/,,,,,,,,/
,,,,2,,,,3,,,,,4,6
,,,/
,,5,9
堆排序(arr); print_r (arr);

排序后生成标准的小顶堆结构如下:

,,,,,,,,,,,,1
,,,,,,,,,,/,,
,,,,,,,,2,,,,,3
,,,,,,/,,,,,,/,
,,,,4,,,5,,,,,6,,7
,,,/
,,8,9
既数组:数组(1,2,3,4,5,6,7,8,9):

代码如下:

函数堆排序(,arr美元)
{
,,,,,,,//求最后一个元素位
,,,,,,,去年美元=count ($ arr);
,,,,,,,//堆排序中通常忽略arr美元[0]
,,,,,,,函数(arr美元,0);
,,,,,,,//最后一个非叶子节点
,,,,,,,,i=last>美元的在1;
,
,,,,,,,//整理成大顶堆,最大的数整到堆顶,并将最大数和堆尾交换,并在之后的计算中忽略数组后端的最大数(去年),直到堆顶(去年=堆顶)
,,,,,,,而(真)
,,,,,,,{
,,,,,,,,,,,,,,,adjustnode(我,最后,美元arr美元);
,,,,,,,,,,,,,,,如果(i>美元;1)
,,,,,,,,,,,,,,,{
,,,,,,,,,,,,,,,,,,,,,,,//移动节点指针,遍历所有非叶子节点
,,,,,,,,,,,,,,,,,,,,,,,我——美元;
,,,,,,,,,,,,,,,}
,,,,,,,,,,,,,,,其他
,,,,,,,,,,,,,,,{
,,,,,,,,,,,,,,,,,,,,,,,去年=1//临界点,既所有排序完成
,,,,,,,,,,,,,,,,,,,,,,,如果去年==($ 1)休息;
,,,,,,,,,,,,,,,,,,,,,,,//当我为1时表示每一次的堆整理都将得到最大数(堆顶,arr[1]美元),重复在根节点调整堆
,,,,,,,,,,,,,,,,,,,,,,,交换(arr去年美元,美元arr [1]);
,,,,,,,,,,,,,,,,,,,,,,,//在数组尾部按大小顺序保留最大的数,定义临界点,以免整理堆时重新打乱数组后面已排序好的元素
,,,,,,,,,,,,,,,,,,,,,,,去年,美元;
,,,,,,,,,,,,,,,}
,,,,,,,}
,,,,,,,//弹出第一个数组元素
,,,,,,,array_shift (arr);
}
,
//整理当前树节点($ n),临界点美元去年之后为已排序好的元素
函数adjustnode (n,最后,美元及美元arr)
{
,,,,,,,l=n<美元;& lt; 1;,,,,,,,//$ n的左孩子位
,,,,,,,如果(!收取(arr [l]美元美元)| | $ l>去年美元)返回;
,,,,,,,$ r=$ l + 1,,,,,,,,//$ n的右孩子位
,
,,,,,,,//如果右孩子比左孩子大,则让父节点的右孩子比
,,,,,,,if ($ r<=来看,这些美元,美元arr [$ r]祝辞arr [l]美元)美元$ l=$ r;null

php中堆排序的实现原理是什么