Zadanie 9.
Kopiec... - sortowane tablicy $dane
w porządku rosnącym.$dane = Array
(
[0] => 130
[1] => 4
[2] => 12
[3] => 32
[4] => 40
[5] => 3
[6] => 14
[7] => 19
[8] => 27
[9] => 25
[10] => 31
[11] => 49
[12] => 51
[13] => 55
[14] => 50
[15] => 100
)
$n = count($dane);
array_unshift($dane, null); // pusty element na początku zmieni indeksy
// budowanie kopca
for($i = 2; $i <= $n; $i++) {
$j = $i; $k = $j / 2;
$x = $dane[$i];
while(($k > 0) && ($dane[$k] < $x)) {
$dane[$j] = $dane[$k];
$j = $k; $k = $j / 2;
}
$dane[$j] = $x;
}
// Wyświetlenie kopca
echo "Kopiec:<br>";
$x = ($n + 1) / 2; $k = 2;
for($i = 1; $i <= $n; $i++) {
for($j = 1; $j <= $x - 1; $j++) echo " ";
echo "<span style='display: inline-block; width:50px; text-align: center;'>$dane[$i]</span>";
for($j = 1; $j <= $x; $j++) echo " ";
if($i + 1 == $k) {
$k += $k; $x /= 2; echo "<br>";
}
}
// Rozbieranie kopca
for($i = $n; $i > 1; $i--) {
$tmp = $dane[1]; $dane[1] = $dane[$i]; $dane[$i] = $tmp; // swap
$j = 1; $k = 2;
while($k < $i) {
if(($k + 1 < $i) && ($dane[$k + 1] > $dane[$k]))
$m = $k + 1;
else
$m = $k;
if($dane[$m] <= $dane[$j]) break;
$tmp = $dane[$j]; $dane[$j] = $dane[$m]; $dane[$m] = $tmp; // swap
$j = $m; $k = $j + $j;
}
}
echo "<br>Rozbieranie kopca -> posortowana tablica";
array_shift($dane);
echo "<pre>\$dane = ";
print_r($dane);
echo "</pre><hr>";
Kopiec:
130
100 55
40 32 49 51
27 19 25 31 3 14 12 50
4
Rozbieranie kopca -> posortowana tablica$dane = Array
(
[0] => 3
[1] => 4
[2] => 12
[3] => 14
[4] => 19
[5] => 25
[6] => 27
[7] => 31
[8] => 32
[9] => 40
[10] => 49
[11] => 50
[12] => 51
[13] => 55
[14] => 100
[15] => 130
)
Złożoność obliczeniowa algorytmu O(n⋅log n).