кодесурса
«PHP

Алгоритм поиска и сортировки PHP: сортировка кучи

script1adsense2code
script1adsense3code

Алгоритм поиска и сортировки PHP: упражнение 2 с решением

Напишите программу PHP для сортировки списка элементов, используя сортировку кучи.

В информатике, heapsort (изобретенный JWJ Williams в 1964 году) является алгоритмом сортировки на основе сравнения. Heapsort можно рассматривать как улучшенную сортировку выбора: подобно этому алгоритму, он делит свои входные данные на отсортированную и несортированную области и интерактивно сжимает несортированную область, выделяя самый большой элемент и перемещая его в отсортированную область. Улучшение состоит в использовании структуры данных кучи, а не линейного поиска времени, чтобы найти максимум. Хотя на некоторых машинах он работает несколько медленнее, чем хорошо реализованная быстрая сортировка, он обладает преимуществом более благоприятного времени выполнения O (n log n) в худшем случае. Heapsort - это алгоритм на месте, но он не является стабильным.

Запуск алгоритма heapsort, сортирующий массив случайно переставленных значений. На первом этапе алгоритма элементы массива переупорядочиваются в соответствии со свойством кучи. Перед фактической сортировкой кратко показана древовидная структура кучи для иллюстрации.

«Пирамидальная сортировка

Анимационные кредиты: RolandH

Пример решения:

PHP-код:

<?php
  class Node
  {
  private $_i; 
  
  public function __construct($key)
  {
  $this->_i = $key;
  }
  
  public function getKey()
  {
  return $this->_i;
  }
  }
  
  class Heap
  {
  private $heap_Array;
  private $_current_Size;
  
  public function __construct()
  {
  $heap_Array = array();
  $this->_current_Size = 0;
  }
  
  // Remove item with max key 

public function remove() { $root = $this->heap_Array[0]; // put last element into root $this->heap_Array[0] = $this->heap_Array[--$this->_current_Size]; $this->bubbleDown(0); return $root; } // Shift process public function bubbleDown($index) { $larger_Child = null; $top = $this->heap_Array[$index]; // save root while ($index < (int)($this->_current_Size/2)) { // not on bottom row $leftChild = 2 * $index + 1; $rightChild = $leftChild + 1; // find larger child if ($rightChild < $this->_current_Size && $this->heap_Array[$leftChild] < $this->heap_Array[$rightChild]) // right child exists? { $larger_Child = $rightChild; } else { $larger_Child = $leftChild; } if ($top->getKey() >= $this->heap_Array[$larger_Child]->getKey()) { break; } // shift child up $this->heap_Array[$index] = $this->heap_Array[$larger_Child]; $index = $larger_Child; // go down } $this->heap_Array[$index] = $top; // root to index } public function insertAt($index, Node $newNode) { $this->heap_Array[$index] = $newNode; } public function incrementSize() { $this->_current_Size++; } public function getSize() { return $this->_current_Size; } public function asArray() { $arr = array(); for ($j = 0; $j < sizeof($this->heap_Array); $j++) { $arr[] = $this->heap_Array[$j]->getKey(); } return $arr; } } function heapsort(Heap $Heap) { $size = $Heap->getSize(); // "sift" all nodes, except lowest level as it has no children for ($j = (int)($size/2) - 1; $j >= 0; $j--) { $Heap->bubbleDown($j); } // sort the heap for ($j = $size-1; $j >= 0; $j--) { $BiggestNode = $Heap->remove(); // use same nodes array for sorted elements $Heap->insertAt($j, $BiggestNode); } return $Heap->asArray(); } $arr = array(3, 0, 2, 5, -1, 4, 1); echo "Original Array : "; echo implode(', ',$arr ); $Heap = new Heap(); foreach ($arr as $key => $val) { $Node = new Node($val); $Heap->insertAt($key, $Node); $Heap->incrementSize(); } $result = heapsort($Heap); echo "\nSorted Array : "; echo implode(', ',$result)."\n"; ?>

Пример вывода:

 Исходный массив: 3, 0, 2, 5, -1, 4, 1                               
Сортированный массив: -1, 0, 1, 2, 3, 4, 5  

Блок-схема:

«Блок-схема:
«Блок-схема:

Редактор кода PHP:

Есть другой способ решить это решение? Внесите свой код (и комментарии) через Disqus.

Предыдущий: Написать программу PHP для сортировки списка элементов с помощью быстрой сортировки.
Далее: написать программу PHP для сортировки списка элементов с помощью сортировки вставками.

Каков уровень сложности этого упражнения?

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code