本文以php作为描述语言较详细讲解堆排序原理,因保证程序可读性,故不做优化,php程序中关于堆的一些概念:
假设n为当前数组的key则,n的父节点为 n>>1 或者 n/2(整除);n的左子节点l= n<<1 或 l=n*2,n的右子节点r=(n<<1)+1 或 r=l+1
$arr=array(1,8,7,2,3,4,6,5,9);
数组$arr的原形态结构如下:
1
/
8 7
/ /
2 3 4 6
/
5 9
heapsort($arr);print_r($arr);
排序后生成标准的小顶堆结构如下:
1
/
2 3
/ /
4 5 6 7
/
8 9
既数组:array(1,2,3,4,5,6,7,8,9):
- function heapsort(&$arr)
- {
-
- $last=count($arr);
-
- array_unshift($arr,0);
-
- $i=$last>>1;
-
-
- while(true)
- {
- adjustnode($i,$last,$arr);
- if($i>1)
- {
-
- $i--;
- }
- else
- {
-
- if($last==1)break;
-
- swap($arr[$last],$arr[1]);
-
- $last--;
- }
- }
-
- array_shift($arr);
- }
-
-
- function adjustnode($n,$last,&$arr)
- {
- $l=$n<<1;
- if(!isset($arr[$l])||$l>$last) return ;
- $r=$l+1;
-
-
- if($r<=$last&&$arr[$r]>$arr[$l]) $l=$r;
-
- if($arr[$l]>$arr[$n])
- {
-
- swap($arr[$l],$arr[$n]);
-
- adjustnode($l,$last,$arr);
- }
- }
-
-
-
- function swap(&$a,&$b)
- {
- $a=$a ^ $b; $b=$a ^ $b; $a=$a ^ $b;
- }
|