함수 힙 정렬(&$arr)
{
//마지막 요소 위치 찾기
$last=count($arr)
//$arr[0]
은 일반적으로 힙 정렬에서 무시됩니다.
array_unshift($arr,0)
//리프가 아닌 마지막 노드
$i=$last>>1
//큰 상위 힙으로 구성하고, 가장 큰 숫자를 힙의 맨 위로 이동하고, 최대 숫자를 힙의 꼬리와 교환하고, 다음 계산에서 배열의 백엔드(마지막)에 있는 최대 숫자를 무시합니다. 힙의 상단(마지막=힙의 상단)
동안(true)
~
adjustnode($i,$last,$arr)
If($i>1)
~
//노드 포인터를 이동하고 리프가 아닌 모든 노드를 탐색합니다
$i--
~
그 외
~
//Critical point last=1, 즉 모든 정렬이 완료됨
If($last==1)break
// i가 1이면 각 힙 정렬이 최대 개수(힙 상단, $ arr[1]), 루트 노드에서 힙 조정을 반복합니다
swap($arr[$last],$arr[1])
// 배열 수의 순서에서 최대 수를 유지하고, 정렬 시 배열 뒤의 정렬된 요소를 방해하지 않도록 임계점을 LAST로 정의합니다.
$마지막--;
~
}
//첫 번째 배열 요소 팝
array_shift($arr)
}
//현재 트리 노드($n)를 구성합니다. 임계점 $last 이후에는 정렬된 요소가 있습니다.
함수 adjustnode($n,$last,&$arr)
{
>
If(!isset($arr[$l])||$l>$last) return
$ R = $ l 1; // $ n의 오른쪽 자식 위치
//오른쪽 자식이 왼쪽 자식보다 크면 부모 노드의 오른쪽 자식을
보다 크게 둡니다.
If($r<=$last&&$arr[$r]>$arr[$l]) $l=$r
//자식 노드 $l이 상위 노드 $n보다 크면 상위 노드 $n과 교환합니다.
If($arr[$l]>$arr[$n]) If($arr[$l]>$arr[$n])
~
//자식 노드($l)의 값을 상위 노드($n)의 값으로 교환
swap($arr[$l],$arr[$n])
//교환 후에도 부모 노드($n)의 값($arr[$n])은 여전히 원자 노드($l)의 자식 노드 값보다 작을 수 있으므로 원자 노드($l)를 조정해야 하며 재귀를 사용하여 구현해야 합니다
adjustnode($l,$last,$arr)
}
}
//두 값 교환
함수 교환(&$a,&$b)
{
$a=$a ^ $b;
$b=$a ^ $b;
$a=$a ^ $b
}
이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.