> 백엔드 개발 > PHP 튜토리얼 > PHP 힙 정렬 구현 원리 및 응용 방법_php 기술

PHP 힙 정렬 구현 원리 및 응용 방법_php 기술

WBOY
풀어 주다: 2016-05-16 20:26:33
원래의
1162명이 탐색했습니다.

이 글의 예시에서는 PHP 힙 정렬의 구현 원리와 적용 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

여기서는 힙 정렬의 원리를 보다 자세히 설명하기 위해 PHP를 사용합니다. PHP 프로그램에서는 힙에 대한 몇 가지 개념을 수행하지 않습니다. 🎜>

n이 현재 배열의 키라고 가정하면 n의 상위 노드는 n>>1 또는 n/2(나누 가능)입니다. n의 왼쪽 하위 노드는 l=n<<1 또는 l=n입니다. *2,n 오른쪽 자식 노드 r=(n<<1) 1 또는 r=l 1

$arr=배열(1,8,7,2,3,4,6,5,9);

$arr 배열의 원래 구조는 다음과 같습니다.

1

~                               7
> 2 3 4 6
/
5 9
heapsort($arr);print_r($arr);

정렬 후 생성된 표준 작은 상단 힙 구조는 다음과 같습니다.

1

~                             3

> 4 5 6 7

/
8 9
즉, 배열: array(1,2,3,4,5,6,7,8,9):




코드 복사

코드는 다음과 같습니다.
함수 힙 정렬(&$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 프로그래밍 설계에 도움이 되기를 바랍니다.

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿