adding sort and making sure original list is unchanged after sort

This commit is contained in:
Dennis Eichhorn 2019-10-09 17:45:53 +02:00
parent b9d0e63beb
commit 1ecf3e8d8c
16 changed files with 294 additions and 4 deletions

View File

@ -54,7 +54,7 @@ class HeapSort implements SortInterface
* @param array $list Data to sort
* @param int $size Heap size
* @param int $index Index element
* @param itn $order Sort order
* @param int $order Sort order
*
* @return void
*

View File

@ -0,0 +1,121 @@
<?php
/**
* Orange Management
*
* PHP Version 7.4
*
* @package phpOMS\Algorithm\Sort;
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://orange-management.org
*/
declare(strict_types=1);
namespace phpOMS\Algorithm\Sort;
/**
* MergeSort class.
*
* @package phpOMS\Algorithm\Sort;
* @license OMS License 1.0
* @link https://orange-management.org
* @since 1.0.0
*/
class MergeSort implements SortInterface
{
/**
* {@inheritdoc}
*/
public static function sort(array $list, int $order = SortOrder::ASC) : array
{
$clone = $list;
self::sortHalve($clone, 0, \count($list) - 1, $order);
return $clone;
}
/**
* Recursive sorting of halve of the list and then merging it
*
* @param array $list Data to sort
* @param int $lo Start of the list to sort
* @param int $hi End of the list to sort
* @param int $order Sort order
*
* @return void
*
* @since 1.0.0
*/
private static function sortHalve(array &$list, int $lo, int $hi, int $order) : void
{
if ($lo >= $hi) {
return;
}
$mi = (int) ($lo + ($hi - $lo) / 2);
self::sortHalve($list, $lo, $mi, $order);
self::sortHalve($list, $mi + 1, $hi, $order);
self::merge($list, $lo, $mi, $hi, $order);
}
/**
* Merge and sort sub list
*
* @param array $list Data to sort
* @param int $lo Start of the list to sort
* @param int $mi Middle point of the list to sort
* @param int $hi End of the list to sort
* @param int $order Sort order
*
* @return void
*
* @since 1.0.0
*/
private static function merge(array &$list, int $lo, int $mi, int $hi, int $order) : void
{
$n1 = $mi - $lo + 1;
$n2 = $hi - $mi;
$loList = [];
$hiList = [];
for ($i = 0; $i < $n1; ++$i) {
$loList[$i] = $list[$lo + $i];
}
for ($i = 0; $i < $n2; ++$i) {
$hiList[$i] = $list[$mi + 1 + $i];
}
$i = 0;
$j = 0;
$k = $lo;
while ($i < $n1 && $j < $n2) {
if (!$loList[$i]->compare($hiList[$j], $order)) {
$list[$k] = $loList[$i];
++$i;
} else {
$list[$k] = $hiList[$j];
++$j;
}
++$k;
}
while ($i < $n1) {
$list[$k] = $loList[$i];
++$i;
++$k;
}
while ($j < $n2) {
$list[$k] = $hiList[$j];
++$j;
++$k;
}
}
}

View File

@ -44,6 +44,10 @@ class BitonicSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value]
);
self::assertEquals(
[5, 1, 4, 2], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -52,5 +56,9 @@ class BitonicSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value]
);
self::assertEquals(
[5, 1, 4, 2], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -45,6 +45,10 @@ class BubbleSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class BubbleSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -45,6 +45,10 @@ class BucketSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class BucketSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -45,6 +45,10 @@ class CocktailShakerSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class CocktailShakerSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -45,6 +45,10 @@ class CombSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class CombSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -45,6 +45,10 @@ class CycleSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class CycleSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -45,6 +45,10 @@ class GnomeSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class GnomeSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -20,7 +20,7 @@ use phpOMS\Algorithm\Sort\SortOrder;
require_once __DIR__ . '/../../Autoloader.php';
/**
* @testdox phpOMS\tests\Algorithm\Sort: Bucket sort test
* @testdox phpOMS\tests\Algorithm\Sort: Heap sort test
*
* @internal
*/
@ -45,6 +45,10 @@ class HeapSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class HeapSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -20,7 +20,7 @@ use phpOMS\Algorithm\Sort\SortOrder;
require_once __DIR__ . '/../../Autoloader.php';
/**
* @testdox phpOMS\tests\Algorithm\Sort: Bucket sort test
* @testdox phpOMS\tests\Algorithm\Sort: Insertion sort test
*
* @internal
*/
@ -45,6 +45,10 @@ class InsertionSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class InsertionSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -20,7 +20,7 @@ use phpOMS\Algorithm\Sort\SortOrder;
require_once __DIR__ . '/../../Autoloader.php';
/**
* @testdox phpOMS\tests\Algorithm\Sort: Bucket sort test
* @testdox phpOMS\tests\Algorithm\Sort: Intro sort test
*
* @internal
*/
@ -45,6 +45,10 @@ class IntroSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class IntroSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -0,0 +1,65 @@
<?php
/**
* Orange Management
*
* PHP Version 7.4
*
* @package tests
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://orange-management.org
*/
declare(strict_types=1);
namespace phpOMS\tests\Algorithm\Sort;
use phpOMS\Algorithm\Sort\MergeSort;
use phpOMS\Algorithm\Sort\SortOrder;
require_once __DIR__ . '/../../Autoloader.php';
/**
* @testdox phpOMS\tests\Algorithm\Sort: Merge sort test
*
* @internal
*/
class MergeSortTest extends \PHPUnit\Framework\TestCase
{
protected $list = [];
protected function setUp() : void
{
$this->list = [
new NumericElement(5),
new NumericElement(1),
new NumericElement(4),
new NumericElement(2),
new NumericElement(8),
];
}
public function testSortASC() : void
{
$newList = MergeSort::sort($this->list);
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
{
$newList = MergeSort::sort($this->list, SortOrder::DESC);
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -45,6 +45,10 @@ class OddEvenSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class OddEvenSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -45,6 +45,10 @@ class QuickSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class QuickSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}

View File

@ -45,6 +45,10 @@ class SelectionSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[1, 2, 4, 5, 8], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
public function testSortDESC() : void
@ -53,5 +57,9 @@ class SelectionSortTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
[8, 5, 4, 2, 1], [$newList[0]->value, $newList[1]->value, $newList[2]->value, $newList[3]->value, $newList[4]->value,]
);
self::assertEquals(
[5, 1, 4, 2, 8], [$this->list[0]->value, $this->list[1]->value, $this->list[2]->value, $this->list[3]->value, $this->list[4]->value,]
);
}
}