From 1ecf3e8d8cd64280552fee521529e738829db8d9 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Wed, 9 Oct 2019 17:45:53 +0200 Subject: [PATCH] adding sort and making sure original list is unchanged after sort --- Algorithm/Sort/HeapSort.php | 2 +- Algorithm/Sort/MergeSort.php | 121 ++++++++++++++++++ tests/Algorithm/Sort/BitonicSortTest.php | 8 ++ tests/Algorithm/Sort/BubbleSortTest.php | 8 ++ tests/Algorithm/Sort/BucketSortTest.php | 8 ++ .../Algorithm/Sort/CocktailShakerSortTest.php | 8 ++ tests/Algorithm/Sort/CombSortTest.php | 8 ++ tests/Algorithm/Sort/CycleSortTest.php | 8 ++ tests/Algorithm/Sort/GnomeSortTest.php | 8 ++ tests/Algorithm/Sort/HeapSortTest.php | 10 +- tests/Algorithm/Sort/InsertionSortTest.php | 10 +- tests/Algorithm/Sort/IntroSortTest.php | 10 +- tests/Algorithm/Sort/MergeSortTest.php | 65 ++++++++++ tests/Algorithm/Sort/OddEvenSortTest.php | 8 ++ tests/Algorithm/Sort/QuickSortTest.php | 8 ++ tests/Algorithm/Sort/SelectionSortTest.php | 8 ++ 16 files changed, 294 insertions(+), 4 deletions(-) create mode 100644 tests/Algorithm/Sort/MergeSortTest.php diff --git a/Algorithm/Sort/HeapSort.php b/Algorithm/Sort/HeapSort.php index 000f4c248..dccac4acd 100644 --- a/Algorithm/Sort/HeapSort.php +++ b/Algorithm/Sort/HeapSort.php @@ -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 * diff --git a/Algorithm/Sort/MergeSort.php b/Algorithm/Sort/MergeSort.php index e69de29bb..31e63d406 100644 --- a/Algorithm/Sort/MergeSort.php +++ b/Algorithm/Sort/MergeSort.php @@ -0,0 +1,121 @@ += $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; + } + } +} diff --git a/tests/Algorithm/Sort/BitonicSortTest.php b/tests/Algorithm/Sort/BitonicSortTest.php index 4c2dac541..8eabf0b78 100644 --- a/tests/Algorithm/Sort/BitonicSortTest.php +++ b/tests/Algorithm/Sort/BitonicSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/BubbleSortTest.php b/tests/Algorithm/Sort/BubbleSortTest.php index f9c84044d..19165bfd0 100644 --- a/tests/Algorithm/Sort/BubbleSortTest.php +++ b/tests/Algorithm/Sort/BubbleSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/BucketSortTest.php b/tests/Algorithm/Sort/BucketSortTest.php index a5e843116..b3296c050 100644 --- a/tests/Algorithm/Sort/BucketSortTest.php +++ b/tests/Algorithm/Sort/BucketSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/CocktailShakerSortTest.php b/tests/Algorithm/Sort/CocktailShakerSortTest.php index 050770118..cc52197fe 100644 --- a/tests/Algorithm/Sort/CocktailShakerSortTest.php +++ b/tests/Algorithm/Sort/CocktailShakerSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/CombSortTest.php b/tests/Algorithm/Sort/CombSortTest.php index 1bc590181..634bc6877 100644 --- a/tests/Algorithm/Sort/CombSortTest.php +++ b/tests/Algorithm/Sort/CombSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/CycleSortTest.php b/tests/Algorithm/Sort/CycleSortTest.php index 5b3f6f0f2..4953cc244 100644 --- a/tests/Algorithm/Sort/CycleSortTest.php +++ b/tests/Algorithm/Sort/CycleSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/GnomeSortTest.php b/tests/Algorithm/Sort/GnomeSortTest.php index b0959fc68..921f1be53 100644 --- a/tests/Algorithm/Sort/GnomeSortTest.php +++ b/tests/Algorithm/Sort/GnomeSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/HeapSortTest.php b/tests/Algorithm/Sort/HeapSortTest.php index b16e84a13..08e819568 100644 --- a/tests/Algorithm/Sort/HeapSortTest.php +++ b/tests/Algorithm/Sort/HeapSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/InsertionSortTest.php b/tests/Algorithm/Sort/InsertionSortTest.php index 5b7ee8c94..8ea67c611 100644 --- a/tests/Algorithm/Sort/InsertionSortTest.php +++ b/tests/Algorithm/Sort/InsertionSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/IntroSortTest.php b/tests/Algorithm/Sort/IntroSortTest.php index 4d68bb53b..aaa5bcfe4 100644 --- a/tests/Algorithm/Sort/IntroSortTest.php +++ b/tests/Algorithm/Sort/IntroSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/MergeSortTest.php b/tests/Algorithm/Sort/MergeSortTest.php new file mode 100644 index 000000000..17eee9eaa --- /dev/null +++ b/tests/Algorithm/Sort/MergeSortTest.php @@ -0,0 +1,65 @@ +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,] + ); + } +} diff --git a/tests/Algorithm/Sort/OddEvenSortTest.php b/tests/Algorithm/Sort/OddEvenSortTest.php index d070bd6e9..8546844a4 100644 --- a/tests/Algorithm/Sort/OddEvenSortTest.php +++ b/tests/Algorithm/Sort/OddEvenSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/QuickSortTest.php b/tests/Algorithm/Sort/QuickSortTest.php index bbdc9285d..8c2174474 100644 --- a/tests/Algorithm/Sort/QuickSortTest.php +++ b/tests/Algorithm/Sort/QuickSortTest.php @@ -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,] + ); } } diff --git a/tests/Algorithm/Sort/SelectionSortTest.php b/tests/Algorithm/Sort/SelectionSortTest.php index 19164bb59..764c7ee11 100644 --- a/tests/Algorithm/Sort/SelectionSortTest.php +++ b/tests/Algorithm/Sort/SelectionSortTest.php @@ -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,] + ); } }