w3resource

PHP Searching and Sorting Algorithm: Strand sort

PHP Searching and Sorting Algorithm: Exercise-15 with Solution

Write a PHP program to sort a list of elements using Strand sort.

This is a way of sorting numbers by extracting shorter sequences of already sorted numbers from an unsorted list.

Sample Solution :

PHP Code :

<?php
// Create a new instance of SplDoublyLinkedList
$lst = new SplDoublyLinkedList();

// Iterate over the array and push each element into the linked list
foreach (array(100, 0, 2, 5, -1, 4, 1) as $v)
    $lst->push($v);

// Call the strandSort function to sort the linked list and iterate over the sorted elements
foreach (strandSort($lst) as $v)
    echo "$v ";

echo " " . PHP_EOL;

// Function to perform Strand Sort on a SplDoublyLinkedList
function strandSort(SplDoublyLinkedList $lst) {
    // Initialize an empty list to store the sorted elements
    $result = new SplDoublyLinkedList();

    // Continue until the input list is empty
    while (!$lst->isEmpty()) {
        // Initialize two lists: one to store the sorted elements and the other to store the remaining elements
        $sorted = new SplDoublyLinkedList();
        $remain = new SplDoublyLinkedList();

        // Move the first element from the input list to the sorted list
        $sorted->push($lst->shift());

        // Iterate over the remaining elements in the input list
        foreach ($lst as $item) {
            // Compare the top element of the sorted list with the current element
            // If the current element is greater than or equal to the top element, add it to the sorted list
            // Otherwise, add it to the remaining list
            if ($sorted->top() <= $item) {
                $sorted->push($item);
            } else {
                $remain->push($item);
            }
        }

        // Merge the sorted list with the result list
        $result = _merge($sorted, $result);

        // Update the input list to contain the remaining elements
        $lst = $remain;
    }

    // Return the sorted result list
    return $result;
}

// Function to merge two sorted lists
function _merge(SplDoublyLinkedList $left, SplDoublyLinkedList $right) {
    // Initialize an empty list to store the merged result
    $res = new SplDoublyLinkedList();

    // Continue until both lists are empty
    while (!$left->isEmpty() && !$right->isEmpty()) {
        // Compare the bottom elements of both lists
        // If the bottom element of the left list is smaller, remove and add it to the result list
        // Otherwise, remove and add the bottom element of the right list to the result list
        if ($left->bottom() <= $right->bottom()) {
            $res->push($left->shift());
        } else {
            $res->push($right->shift());
        }
    }

    // Add any remaining elements from the left list to the result list
    foreach ($left as $v)
        $res->push($v);

    // Add any remaining elements from the right list to the result list
    foreach ($right as $v)
        $res->push($v);

    // Return the merged result list
    return $res;
}
?>

Output:

-1 0 1 2 4 5 100 

Explanation:

In the exercise above,

  • Initialization and input:
    • An instance of "SplDoublyLinkedList" named '$lst' is created to store the input elements.
    • The input array [100, 0, 2, 5, -1, 4, 1] is iterated over, and each element is pushed onto the doubly linked list.
  • Strand Sort Function (strandSort):
    • This function takes a doubly linked list '$lst' as input and sorts it using the Strand Sort algorithm.
    • The function starts by initializing an empty list named '$result' to store the sorted elements.
    • The sorting process continues until the input list is empty.
    • During each iteration, two additional lists are created: '$sorted' to store sorted elements and '$remain' to store remaining elements.
    • The first element from the input list is moved to the '$sorted' list.
    • Next, each element is examined:
      • If the element is greater than or equal to the top element of the '$sorted' list, it is appended to the '$sorted' list.
      • Otherwise, it is appended to the '$remain' list.
    • After processing all elements in the input list, the sorted list '$sorted' is merged with the '$result' list using the "_merge()" function.
    • The input list '$lst' is updated to contain the remaining elements stored in the '$remain' list.
  • Merge Function (_merge):
    • This function takes two sorted doubly linked lists ('$left' and '$right') as input and merges them into a single sorted list.
    • An empty list named '$res' is initialized to store the merged result.
    • Elements are iteratively removed from the bottom of '$left' and '$right' lists and added to '$res' in sorted order.
    • After one of the lists becomes empty, any remaining elements in the other list are added to '$res'.
    • Finally, the merged result list '$res' is returned.
  • Output:
    • After sorting the input list using the "strandSort()" function, the sorted elements are retrieved one by one using a "foreach" loop and printed to the console.

Flowchart :

Flowchart: PHP - program of Strand sort

PHP Code Editor:


Have another way to solve this solution? Contribute your code (and comments) through Disqus.

Previous: Write a PHP program to sort a list of elements using Bogo sort.
Next: Write a PHP program to sort a list of elements using Patience sort.

What is the difficulty level of this exercise?

Test your Programming skills with w3resource's quiz.



Become a Patron!

Follow us on Facebook and Twitter for latest update.

It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.

https://www.w3resource.com/php-exercises/searching-and-sorting-algorithm/searching-and-sorting-algorithm-exercise-15.php