Strand Sort
Strand Sort is a sorting algorithm that was developed by Craig McQueen in 2005. It is a comparison-based sorting algorithm that works by repeatedly scanning the input list, removing sorted elements from it, and appending them to a new list in sorted order until no unsorted elements remain.
The basic idea behind Strand Sort is to find "strands" of increasing elements in the input list and merge them into the output list. A strand is defined as a subsequence of the input list where each element is greater than or equal to the previous element. The algorithm repeatedly scans the input list, selecting the longest strand of increasing elements it can find and appending it to the output list. The selected strand is then removed from the input list, and the process is repeated until no unsorted elements remain.
One of the key advantages of Strand Sort is that it has a worst-case time complexity of O(n log n), which is the same as many other popular sorting algorithms like Merge Sort and Quicksort. However, it has a number of additional optimizations that can make it more efficient than these algorithms in certain cases.
One of the main drawbacks of Strand Sort is that it requires a lot of memory to perform the sort, since it needs to maintain both the input and output lists in memory at the same time. This can make it less practical for sorting very large datasets that do not fit in memory.
Here given code implementation process.
// C program
// Strand Sort
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int element;
struct Node *next;
};
//Create a node
struct Node *create_node(int data)
{
struct Node *node = (struct Node *) malloc(sizeof(struct Node *));
if (node != NULL)
{
node->element = data;
node->next = NULL;
}
return node;
}
//Merge two sorted list and return its result
struct Node *merge_list(struct Node *list1, struct Node *list2)
{
if (list1 == NULL)
{
//When list1 is empty
return list2;
}
else if (list2 == NULL)
{
return list1;
}
else
{
//Some auxiliary variables
struct Node *head = NULL;
struct Node *tail = NULL;
struct Node *node = NULL;
// Combine list elements in sorted order
// This process takes(m+n) time
// Here m is size of list1
// And n is size of list2
while (list1 != NULL || list2 != NULL)
{
if (list1 != NULL && list2 != NULL)
{
if (list1->element < list2->element)
{
node = list1;
list1 = list1->next;
}
else
{
node = list2;
list2 = list2->next;
}
}
else if (list1 != NULL)
{
node = list1;
list1 = list1->next;
}
else
{
node = list2;
list2 = list2->next;
}
if (head == NULL)
{
//When get first node of resultant list
head = node;
}
else
{
//Add node at end of resultant list
tail->next = node;
}
node->next = NULL;
tail = node;
}
return head;
}
}
//Perform the standard sort of given list elements
struct Node *stander_sort(struct Node *input_list, struct Node *output_list)
{
if (input_list == NULL)
{
return output_list;
}
//create new list and set first element of input list
struct Node *sub_list = input_list;
struct Node *tail = sub_list;
struct Node *back = NULL;
//visit to next element
//like remove first node initial input list
input_list = sub_list->next;
struct Node *auxiliary_list = input_list;
int item = sub_list->element;
while (auxiliary_list != NULL)
{
if (auxiliary_list->element > item)
{
//Add node at end of sublist
tail->next = auxiliary_list;
item = auxiliary_list->element;
if (back == NULL)
{
//remove front node in actual list
input_list = auxiliary_list->next;
auxiliary_list = auxiliary_list->next;
}
else
{
auxiliary_list = auxiliary_list->next;
//remove intermediate element
back->next = auxiliary_list;
}
tail = tail->next;
}
else
{
back = auxiliary_list;
auxiliary_list = auxiliary_list->next;
}
}
// Separate the new sublist
tail->next = NULL;
output_list = merge_list(output_list, sub_list);
return stander_sort(input_list, output_list);
}
//This are providing the environment setup to perform standard sort
void sort_element(int collection[], int size)
{
if (size <= 1)
{
return;
}
//Loop controlling variable
int i = 0;
//Create editable list
struct Node *input_list = NULL;
struct Node *output_list = NULL;
//Some auxiliary variables
struct Node *tail = NULL;
struct Node *node = NULL;
//Find add array element into custom list
for (i = 0; i < size; ++i)
{
node = create_node(collection[i]);
if (input_list == NULL)
{
input_list = node;
}
else
{
tail->next = node;
}
tail = node;
}
output_list = stander_sort(input_list, output_list);
input_list = NULL;
i = 0;
// Insert element into actual collection
while (output_list != NULL)
{
//Get current node
node = output_list;
//set element into collection
collection[i] = node->element;
//visit to next node
output_list = node->next;
//free node
free(node);
node = NULL;
i++;
}
}
//Display element of given collection
void display_element(int collection[], int size)
{
for (int i = 0; i < size; ++i)
{
printf(" %d", collection[i]);
}
printf("\n");
}
int main()
{
// Define the unsorted array elements
int collection[] = {
7 , 3 , 0 , 8 , 23 , 2 , 9 , 35 , 13 , 12 , 1 , 3
};
//Get the size of given collection
int size = sizeof(collection) / sizeof(collection[0]);
printf("\n Before sort : ");
display_element(collection, size);
sort_element(collection, size);
printf("\n After sort : ");
display_element(collection, size);
return 0;
}
Output
Before sort : 7 3 0 8 23 2 9 35 13 12 1 3
After sort : 0 1 2 3 3 7 8 9 12 13 23 35
/*
Java Program
Strand Sort
*/
//Node of list element
class Node
{
public int element;
public Node next;
public Node(int data)
{
this.element = data;
this.next = null;
}
}
class StrandSort
{
//Merge two sorted list and return its result
public Node merge_list(Node list1, Node list2)
{
if (list1 == null)
{
//When list1 is empty
return list2;
}
else if (list2 == null)
{
return list1;
}
else
{
//Some auxiliary variables
Node head = null;
Node tail = null;
Node node = null;
// Combine list elements in sorted order
// This process takes(m+n) time
// Here m is size of list1
// And n is size of list2
while (list1 != null || list2 != null)
{
if (list1 != null && list2 != null)
{
if (list1.element < list2.element)
{
node = list1;
list1 = list1.next;
}
else
{
node = list2;
list2 = list2.next;
}
}
else if (list1 != null)
{
node = list1;
list1 = list1.next;
}
else
{
node = list2;
list2 = list2.next;
}
if (head == null)
{
//When get first node of resultant list
head = node;
}
else
{
//Add node at end of resultant list
tail.next = node;
}
node.next = null;
tail = node;
}
return head;
}
}
//Perform the standard sort of given list elements
public Node stander_sort(Node input_list, Node output_list)
{
if (input_list == null)
{
return output_list;
}
//create new list and set first element of input list
Node sub_list = input_list;
Node tail = sub_list;
Node back = null;
//visit to next element
//like remove first node initial input list
input_list = sub_list.next;
Node auxiliary_list = input_list;
int item = sub_list.element;
while (auxiliary_list != null)
{
if (auxiliary_list.element > item)
{
//Add node at end of sublist
tail.next = auxiliary_list;
item = auxiliary_list.element;
if (back == null)
{
//remove front node in actual list
input_list = auxiliary_list.next;
auxiliary_list = auxiliary_list.next;
}
else
{
auxiliary_list = auxiliary_list.next;
//remove intermediate element
back.next = auxiliary_list;
}
tail = tail.next;
}
else
{
back = auxiliary_list;
auxiliary_list = auxiliary_list.next;
}
}
// Separate the new sublist
tail.next = null;
output_list = merge_list(output_list, sub_list);
return stander_sort(input_list, output_list);
}
//This are providing the environment setup to perform standard sort
public void sort_element(int[] collection, int size)
{
if (size <= 1)
{
return;
}
//Loop controlling variable
int i = 0;
//Create editable list
Node input_list = null;
Node output_list = null;
//Some auxiliary variables
Node tail = null;
Node node = null;
//Find add array element into custom list
for (i = 0; i < size; ++i)
{
node = new Node(collection[i]);
if (input_list == null)
{
input_list = node;
}
else
{
tail.next = node;
}
tail = node;
}
output_list = stander_sort(input_list, output_list);
input_list = null;
i = 0;
// Insert element into actual collection
while (output_list != null)
{
//Get current node
node = output_list;
//set element into collection
collection[i] = node.element;
//visit to next node
output_list = node.next;
node = null;
i++;
}
}
//Display element of given collection
public void display_element(int[] collection, int size)
{
for (int i = 0; i < size; ++i)
{
System.out.print(" " + collection[i]);
}
System.out.print("\n");
}
public static void main(String[] args)
{
StrandSort obj = new StrandSort();
// Define the unsorted array elements
int[] collection = {
7,
3,
0,
8,
23,
2,
9,
35,
13,
12,
1,
3
};
//Get the size of given collection
int size = collection.length;
System.out.print("\n Before sort : ");
obj.display_element(collection, size);
//sort collection element
obj.sort_element(collection, size);
System.out.print("\n After sort : ");
obj.display_element(collection, size);
}
}
Output
Before sort : 7 3 0 8 23 2 9 35 13 12 1 3
After sort : 0 1 2 3 3 7 8 9 12 13 23 35
//Include header file
#include <iostream>
using namespace std;
/*
C++ Program
Strand Sort
*/
//Node of list element
class Node
{
public:
int element;
Node *next;
Node(int data)
{
this->element = data;
this->next = NULL;
}
};
class StrandSort
{
public:
//Merge two sorted list and return its result
Node *merge_list(Node *list1, Node *list2)
{
if (list1 == NULL)
{
//When list1 is empty
return list2;
}
else if (list2 == NULL)
{
return list1;
}
else
{
//Some auxiliary variables
Node *head = NULL;
Node *tail = NULL;
Node *node = NULL;
// Combine list elements in sorted order
// This process takes(m+n) time
// Here m is size of list1
// And n is size of list2
while (list1 != NULL || list2 != NULL)
{
if (list1 != NULL && list2 != NULL)
{
if (list1->element < list2->element)
{
node = list1;
list1 = list1->next;
}
else
{
node = list2;
list2 = list2->next;
}
}
else if (list1 != NULL)
{
node = list1;
list1 = list1->next;
}
else
{
node = list2;
list2 = list2->next;
}
if (head == NULL)
{
//When get first node of resultant list
head = node;
}
else
{
//Add node at end of resultant list
tail->next = node;
}
node->next = NULL;
tail = node;
}
return head;
}
}
//Perform the standard sort of given list elements
Node *stander_sort(Node *input_list, Node *output_list)
{
if (input_list == NULL)
{
return output_list;
}
//create new list and set first element of input list
Node *sub_list = input_list;
Node *tail = sub_list;
Node *back = NULL;
//visit to next element
//like remove first node initial input list
input_list = sub_list->next;
Node *auxiliary_list = input_list;
int item = sub_list->element;
while (auxiliary_list != NULL)
{
if (auxiliary_list->element > item)
{
//Add node at end of sublist
tail->next = auxiliary_list;
item = auxiliary_list->element;
if (back == NULL)
{
//remove front node in actual list
input_list = auxiliary_list->next;
auxiliary_list = auxiliary_list->next;
}
else
{
auxiliary_list = auxiliary_list->next;
//remove intermediate element
back->next = auxiliary_list;
}
tail = tail->next;
}
else
{
back = auxiliary_list;
auxiliary_list = auxiliary_list->next;
}
}
// Separate the new sublist
tail->next = NULL;
output_list = this->merge_list(output_list, sub_list);
return this->stander_sort(input_list, output_list);
}
//This are providing the environment setup to perform standard sort
void sort_element(int collection[], int size)
{
if (size <= 1)
{
return;
}
//Loop controlling variable
int i = 0;
//Create editable list
Node *input_list = NULL;
Node *output_list = NULL;
//Some auxiliary variables
Node *tail = NULL;
Node *node = NULL;
//Find add array element into custom list
for (i = 0; i < size; ++i)
{
node = new Node(collection[i]);
if (input_list == NULL)
{
input_list = node;
}
else
{
tail->next = node;
}
tail = node;
}
output_list = this->stander_sort(input_list, output_list);
input_list = NULL;
i = 0;
// Insert element into actual collection
while (output_list != NULL)
{
//Get current node
node = output_list;
//set element into collection
collection[i] = node->element;
//visit to next node
output_list = node->next;
node = NULL;
i++;
}
}
//Display element of given collection
void display_element(int collection[], int size)
{
for (int i = 0; i < size; ++i)
{
cout << " " << collection[i];
}
cout << "\n";
}
};
int main()
{
StrandSort obj = StrandSort();
// Define the unsorted array elements
int collection[] = {
7 , 3 , 0 , 8 , 23 , 2 , 9 , 35 , 13 , 12 , 1 , 3
};
//Get the size of given collection
int size = sizeof(collection) / sizeof(collection[0]);
cout << "\n Before sort : ";
obj.display_element(collection, size);
//sort collection element
obj.sort_element(collection, size);
cout << "\n After sort : ";
obj.display_element(collection, size);
return 0;
}
Output
Before sort : 7 3 0 8 23 2 9 35 13 12 1 3
After sort : 0 1 2 3 3 7 8 9 12 13 23 35
//Include namespace system
using System;
/*
C# Program
Strand Sort
*/
//Node of list element
class Node
{
public int element;
public Node next;
public Node(int data)
{
this.element = data;
this.next = null;
}
}
class StrandSort
{
//Merge two sorted list and return its result
public Node merge_list(Node list1, Node list2)
{
if (list1 == null)
{
//When list1 is empty
return list2;
}
else if (list2 == null)
{
return list1;
}
else
{
//Some auxiliary variables
Node head = null;
Node tail = null;
Node node = null;
// Combine list elements in sorted order
// This process takes(m+n) time
// Here m is size of list1
// And n is size of list2
while (list1 != null || list2 != null)
{
if (list1 != null && list2 != null)
{
if (list1.element < list2.element)
{
node = list1;
list1 = list1.next;
}
else
{
node = list2;
list2 = list2.next;
}
}
else if (list1 != null)
{
node = list1;
list1 = list1.next;
}
else
{
node = list2;
list2 = list2.next;
}
if (head == null)
{
//When get first node of resultant list
head = node;
}
else
{
//Add node at end of resultant list
tail.next = node;
}
node.next = null;
tail = node;
}
return head;
}
}
//Perform the standard sort of given list elements
public Node stander_sort(Node input_list, Node output_list)
{
if (input_list == null)
{
return output_list;
}
//create new list and set first element of input list
Node sub_list = input_list;
Node tail = sub_list;
Node back = null;
//visit to next element
//like remove first node initial input list
input_list = sub_list.next;
Node auxiliary_list = input_list;
int item = sub_list.element;
while (auxiliary_list != null)
{
if (auxiliary_list.element > item)
{
//Add node at end of sublist
tail.next = auxiliary_list;
item = auxiliary_list.element;
if (back == null)
{
//remove front node in actual list
input_list = auxiliary_list.next;
auxiliary_list = auxiliary_list.next;
}
else
{
auxiliary_list = auxiliary_list.next;
//remove intermediate element
back.next = auxiliary_list;
}
tail = tail.next;
}
else
{
back = auxiliary_list;
auxiliary_list = auxiliary_list.next;
}
}
// Separate the new sublist
tail.next = null;
output_list = merge_list(output_list, sub_list);
return stander_sort(input_list, output_list);
}
//This are providing the environment setup to perform standard sort
public void sort_element(int[] collection, int size)
{
if (size <= 1)
{
return;
}
//Loop controlling variable
int i = 0;
//Create editable list
Node input_list = null;
Node output_list = null;
//Some auxiliary variables
Node tail = null;
Node node = null;
//Find add array element into custom list
for (i = 0; i < size; ++i)
{
node = new Node(collection[i]);
if (input_list == null)
{
input_list = node;
}
else
{
tail.next = node;
}
tail = node;
}
output_list = stander_sort(input_list, output_list);
input_list = null;
i = 0;
// Insert element into actual collection
while (output_list != null)
{
//Get current node
node = output_list;
//set element into collection
collection[i] = node.element;
//visit to next node
output_list = node.next;
node = null;
i++;
}
}
//Display element of given collection
public void display_element(int[] collection, int size)
{
for (int i = 0; i < size; ++i)
{
Console.Write(" " + collection[i]);
}
Console.Write("\n");
}
public static void Main(String[] args)
{
StrandSort obj = new StrandSort();
// Define the unsorted array elements
int[] collection = {
7 , 3 , 0 , 8 , 23 , 2 , 9 , 35 , 13 , 12 , 1 , 3
};
//Get the size of given collection
int size = collection.Length;
Console.Write("\n Before sort : ");
obj.display_element(collection, size);
//sort collection element
obj.sort_element(collection, size);
Console.Write("\n After sort : ");
obj.display_element(collection, size);
}
}
Output
Before sort : 7 3 0 8 23 2 9 35 13 12 1 3
After sort : 0 1 2 3 3 7 8 9 12 13 23 35
<?php
/*
Php Program
Strand Sort
*/
//Node of list element
class Node
{
public $element;
public $next;
function __construct($data)
{
$this->element = $data;
$this->next = null;
}
}
class StrandSort
{
//Merge two sorted list and return its result
public function merge_list($list1, $list2)
{
if ($list1 == null)
{
//When list1 is empty
return $list2;
}
else if ($list2 == null)
{
return $list1;
}
else
{
//Some auxiliary variables
$head = null;
$tail = null;
$node = null;
// Combine list elements in sorted order
// This process takes(m+n) time
// Here m is size of list1
// And n is size of list2
while ($list1 != null || $list2 != null)
{
if ($list1 != null && $list2 != null)
{
if ($list1->element < $list2->element)
{
$node = $list1;
$list1 = $list1->next;
}
else
{
$node = $list2;
$list2 = $list2->next;
}
}
else if ($list1 != null)
{
$node = $list1;
$list1 = $list1->next;
}
else
{
$node = $list2;
$list2 = $list2->next;
}
if ($head == null)
{
//When get first node of resultant list
$head = $node;
}
else
{
//Add node at end of resultant list
$tail->next = $node;
}
$node->next = null;
$tail = $node;
}
return $head;
}
}
//Perform the standard sort of given list elements
public function stander_sort($input_list, $output_list)
{
if ($input_list == null)
{
return $output_list;
}
//create new list and set first element of input list
$sub_list = $input_list;
$tail = $sub_list;
$back = null;
//visit to next element
//like remove first node initial input list
$input_list = $sub_list->next;
$auxiliary_list = $input_list;
$item = $sub_list->element;
while ($auxiliary_list != null)
{
if ($auxiliary_list->element > $item)
{
//Add node at end of sublist
$tail->next = $auxiliary_list;
$item = $auxiliary_list->element;
if ($back == null)
{
//remove front node in actual list
$input_list = $auxiliary_list->next;
$auxiliary_list = $auxiliary_list->next;
}
else
{
$auxiliary_list = $auxiliary_list->next;
//remove intermediate element
$back->next = $auxiliary_list;
}
$tail = $tail->next;
}
else
{
$back = $auxiliary_list;
$auxiliary_list = $auxiliary_list->next;
}
}
// Separate the new sublist
$tail->next = null;
$output_list = $this->merge_list($output_list, $sub_list);
return $this->stander_sort($input_list, $output_list);
}
//This are providing the environment setup to perform standard sort
public function sort_element( & $collection, $size)
{
if ($size <= 1)
{
return;
}
//Loop controlling variable
$i = 0;
//Create editable list
$input_list = null;
$output_list = null;
//Some auxiliary variables
$tail = null;
$node = null;
//Find add array element into custom list
for ($i = 0; $i < $size; ++$i)
{
$node = new Node($collection[$i]);
if ($input_list == null)
{
$input_list = $node;
}
else
{
$tail->next = $node;
}
$tail = $node;
}
$output_list = $this->stander_sort($input_list, $output_list);
$input_list = null;
$i = 0;
// Insert element into actual collection
while ($output_list != null)
{
//Get current node
$node = $output_list;
//set element into collection
$collection[$i] = $node->element;
//visit to next node
$output_list = $node->next;
$node = null;
$i++;
}
}
//Display element of given collection
public function display_element( & $collection, $size)
{
for ($i = 0; $i < $size; ++$i)
{
echo " ". $collection[$i];
}
echo "\n";
}
}
function main()
{
$obj = new StrandSort();
// Define the unsorted array elements
$collection = array(7, 3, 0, 8, 23, 2, 9, 35, 13, 12, 1, 3);
//Get the size of given collection
$size = count($collection);
echo "\n Before sort : ";
$obj->display_element($collection, $size);
//sort collection element
$obj->sort_element($collection, $size);
echo "\n After sort : ";
$obj->display_element($collection, $size);
}
main();
Output
Before sort : 7 3 0 8 23 2 9 35 13 12 1 3
After sort : 0 1 2 3 3 7 8 9 12 13 23 35
/*
Node Js Program
Strand Sort
*/
//Node of list element
class Node
{
constructor(data)
{
this.element = data;
this.next = null;
}
}
class StrandSort
{
//Merge two sorted list and return its result
merge_list(list1, list2)
{
if (list1 == null)
{
//When list1 is empty
return list2;
}
else if (list2 == null)
{
return list1;
}
else
{
//Some auxiliary variables
var head = null;
var tail = null;
var node = null;
// Combine list elements in sorted order
// This process takes(m+n) time
// Here m is size of list1
// And n is size of list2
while (list1 != null || list2 != null)
{
if (list1 != null && list2 != null)
{
if (list1.element < list2.element)
{
node = list1;
list1 = list1.next;
}
else
{
node = list2;
list2 = list2.next;
}
}
else if (list1 != null)
{
node = list1;
list1 = list1.next;
}
else
{
node = list2;
list2 = list2.next;
}
if (head == null)
{
//When get first node of resultant list
head = node;
}
else
{
//Add node at end of resultant list
tail.next = node;
}
node.next = null;
tail = node;
}
return head;
}
}
//Perform the standard sort of given list elements
stander_sort(input_list, output_list)
{
if (input_list == null)
{
return output_list;
}
//create new list and set first element of input list
var sub_list = input_list;
var tail = sub_list;
var back = null;
//visit to next element
//like remove first node initial input list
input_list = sub_list.next;
var auxiliary_list = input_list;
var item = sub_list.element;
while (auxiliary_list != null)
{
if (auxiliary_list.element > item)
{
//Add node at end of sublist
tail.next = auxiliary_list;
item = auxiliary_list.element;
if (back == null)
{
//remove front node in actual list
input_list = auxiliary_list.next;
auxiliary_list = auxiliary_list.next;
}
else
{
auxiliary_list = auxiliary_list.next;
//remove intermediate element
back.next = auxiliary_list;
}
tail = tail.next;
}
else
{
back = auxiliary_list;
auxiliary_list = auxiliary_list.next;
}
}
// Separate the new sublist
tail.next = null;
output_list = this.merge_list(output_list, sub_list);
return this.stander_sort(input_list, output_list);
}
//This are providing the environment setup to perform standard sort
sort_element(collection, size)
{
if (size <= 1)
{
return;
}
//Loop controlling variable
var i = 0;
//Create editable list
var input_list = null;
var output_list = null;
//Some auxiliary variables
var tail = null;
var node = null;
//Find add array element into custom list
for (i = 0; i < size; ++i)
{
node = new Node(collection[i]);
if (input_list == null)
{
input_list = node;
}
else
{
tail.next = node;
}
tail = node;
}
output_list = this.stander_sort(input_list, output_list);
input_list = null;
i = 0;
// Insert element into actual collection
while (output_list != null)
{
//Get current node
node = output_list;
//set element into collection
collection[i] = node.element;
//visit to next node
output_list = node.next;
node = null;
i++;
}
}
//Display element of given collection
display_element(collection, size)
{
for (var i = 0; i < size; ++i)
{
process.stdout.write(" " + collection[i]);
}
process.stdout.write("\n");
}
}
function main()
{
var obj = new StrandSort();
// Define the unsorted array elements
var collection = [7, 3, 0, 8, 23, 2, 9, 35, 13, 12, 1, 3];
//Get the size of given collection
var size = collection.length;
process.stdout.write("\n Before sort : ");
obj.display_element(collection, size);
//sort collection element
obj.sort_element(collection, size);
process.stdout.write("\n After sort : ");
obj.display_element(collection, size);
}
main();
Output
Before sort : 7 3 0 8 23 2 9 35 13 12 1 3
After sort : 0 1 2 3 3 7 8 9 12 13 23 35
# Python 3 Program
# Strand Sort
# Node of list element
class Node :
def __init__(self, data) :
self.element = data
self.next = None
class StrandSort :
# Merge two sorted list and return its result
def merge_list(self, list1, list2) :
if (list1 == None) :
# When list1 is empty
return list2
elif(list2 == None) :
return list1
else :
# Some auxiliary variables
head = None
tail = None
node = None
# Combine list elements in sorted order
# This process takes(m+n) time
# Here m is size of list1
# And n is size of list2
while (list1 != None or list2 != None) :
if (list1 != None and list2 != None) :
if (list1.element < list2.element) :
node = list1
list1 = list1.next
else :
node = list2
list2 = list2.next
elif(list1 != None) :
node = list1
list1 = list1.next
else :
node = list2
list2 = list2.next
if (head == None) :
# When get first node of resultant list
head = node
else :
# Add node at end of resultant list
tail.next = node
node.next = None
tail = node
return head
# Perform the standard sort of given list elements
def stander_sort(self, input_list, output_list) :
if (input_list == None) :
return output_list
# create new list and set first element of input list
sub_list = input_list
tail = sub_list
back = None
# visit to next element
# like remove first node initial input list
input_list = sub_list.next
auxiliary_list = input_list
item = sub_list.element
while (auxiliary_list != None) :
if (auxiliary_list.element > item) :
# Add node at end of sublist
tail.next = auxiliary_list
item = auxiliary_list.element
if (back == None) :
# remove front node in actual list
input_list = auxiliary_list.next
auxiliary_list = auxiliary_list.next
else :
auxiliary_list = auxiliary_list.next
# remove intermediate element
back.next = auxiliary_list
tail = tail.next
else :
back = auxiliary_list
auxiliary_list = auxiliary_list.next
# Separate the new sublist
tail.next = None
output_list = self.merge_list(output_list, sub_list)
return self.stander_sort(input_list, output_list)
# This are providing the environment setup to perform standard sort
def sort_element(self, collection, size) :
if (size <= 1) :
return
# Loop controlling variable
i = 0
# Create editable list
input_list = None
output_list = None
# Some auxiliary variables
tail = None
node = None
# Find add array element into custom list
while (i < size) :
node = Node(collection[i])
if (input_list == None) :
input_list = node
else :
tail.next = node
tail = node
i += 1
output_list = self.stander_sort(input_list, output_list)
input_list = None
i = 0
# Insert element into actual collection
while (output_list != None) :
# Get current node
node = output_list
# set element into collection
collection[i] = node.element
# visit to next node
output_list = node.next
node = None
i += 1
# Display element of given collection
def display_element(self, collection, size) :
i = 0
while (i < size) :
print(" ", collection[i], end = "")
i += 1
print("\n", end = "")
def main() :
obj = StrandSort()
# Define the unsorted array elements
collection = [7, 3, 0, 8, 23, 2, 9, 35, 13, 12, 1, 3]
# Get the size of given collection
size = len(collection)
print("\n Before sort : ", end = "")
obj.display_element(collection, size)
# sort collection element
obj.sort_element(collection, size)
print("\n After sort : ", end = "")
obj.display_element(collection, size)
if __name__ == "__main__": main()
Output
Before sort : 7 3 0 8 23 2 9 35 13 12 1 3
After sort : 0 1 2 3 3 7 8 9 12 13 23 35
# Ruby Program
# Strand Sort
# Node of list element
class Node
# Define the accessor and reader of class Node
attr_reader :element, :next
attr_accessor :element, :next
def initialize(data)
self.element = data
self.next = nil
end
end
class StrandSort
# Merge two sorted list and return its result
def merge_list(list1, list2)
if (list1 == nil)
# When list1 is empty
return list2
elsif(list2 == nil)
return list1
else
# Some auxiliary variables
head = nil
tail = nil
node = nil
# Combine list elements in sorted order
# This process takes(m+n) time
# Here m is size of list1
# And n is size of list2
while (list1 != nil || list2 != nil)
if (list1 != nil && list2 != nil)
if (list1.element < list2.element)
node = list1
list1 = list1.next
else
node = list2
list2 = list2.next
end
elsif(list1 != nil)
node = list1
list1 = list1.next
else
node = list2
list2 = list2.next
end
if (head == nil)
# When get first node of resultant list
head = node
else
# Add node at end of resultant list
tail.next = node
end
node.next = nil
tail = node
end
return head
end
end
# Perform the standard sort of given list elements
def stander_sort(input_list, output_list)
if (input_list == nil)
return output_list
end
# create new list and set first element of input list
sub_list = input_list
tail = sub_list
back = nil
# visit to next element
# like remove first node initial input list
input_list = sub_list.next
auxiliary_list = input_list
item = sub_list.element
while (auxiliary_list != nil)
if (auxiliary_list.element > item)
# Add node at end of sublist
tail.next = auxiliary_list
item = auxiliary_list.element
if (back == nil)
# remove front node in actual list
input_list = auxiliary_list.next
auxiliary_list = auxiliary_list.next
else
auxiliary_list = auxiliary_list.next
# remove intermediate element
back.next = auxiliary_list
end
tail = tail.next
else
back = auxiliary_list
auxiliary_list = auxiliary_list.next
end
end
# Separate the new sublist
tail.next = nil
output_list = self.merge_list(output_list, sub_list)
return self.stander_sort(input_list, output_list)
end
# This are providing the environment setup to perform standard sort
def sort_element(collection, size)
if (size <= 1)
return
end
# Loop controlling variable
i = 0
# Create editable list
input_list = nil
output_list = nil
# Some auxiliary variables
tail = nil
node = nil
# Find add array element into custom list
while (i < size)
node = Node.new(collection[i])
if (input_list == nil)
input_list = node
else
tail.next = node
end
tail = node
i += 1
end
output_list = self.stander_sort(input_list, output_list)
input_list = nil
i = 0
# Insert element into actual collection
while (output_list != nil)
# Get current node
node = output_list
# set element into collection
collection[i] = node.element
# visit to next node
output_list = node.next
node = nil
i += 1
end
end
# Display element of given collection
def display_element(collection, size)
i = 0
while (i < size)
print(" ", collection[i])
i += 1
end
print("\n")
end
end
def main()
obj = StrandSort.new()
# Define the unsorted array elements
collection = [7, 3, 0, 8, 23, 2, 9, 35, 13, 12, 1, 3]
# Get the size of given collection
size = collection.length
print("\n Before sort : ")
obj.display_element(collection, size)
# sort collection element
obj.sort_element(collection, size)
print("\n After sort : ")
obj.display_element(collection, size)
end
main()
Output
Before sort : 7 3 0 8 23 2 9 35 13 12 1 3
After sort : 0 1 2 3 3 7 8 9 12 13 23 35
/*
Scala Program
Strand Sort
*/
//Node of list element
class Node(var element: Int,
var next: Node)
{
def this(data: Int)
{
this(data, null);
}
}
class StrandSort(var input_list : Node)
{
def this()
{
this(null);
}
//Merge two sorted list and return its result
def merge_list(l1: Node, l2: Node): Node = {
var list1 = l1;
var list2 = l2;
if (list1 == null)
{
//When list1 is empty
return list2;
}
else if (list2 == null)
{
return list1;
}
else
{
//Some auxiliary variables
var head: Node = null;
var tail: Node = null;
var node: Node = null;
// Combine list elements in sorted order
// This process takes(m+n) time
// Here m is size of list1
// And n is size of list2
while (list1 != null || list2 != null)
{
if (list1 != null && list2 != null)
{
if (list1.element < list2.element)
{
node = list1;
list1 = list1.next;
}
else
{
node = list2;
list2 = list2.next;
}
}
else if (list1 != null)
{
node = list1;
list1 = list1.next;
}
else
{
node = list2;
list2 = list2.next;
}
if (head == null)
{
//When get first node of resultant list
head = node;
}
else
{
//Add node at end of resultant list
tail.next = node;
}
node.next = null;
tail = node;
}
return head;
}
}
//Perform the standard sort of given list elements
def stander_sort(output_list: Node): Node = {
if (this.input_list == null)
{
return output_list;
}
//create new list and set first element of input list
var sub_list: Node = this.input_list;
var tail: Node = sub_list;
var back: Node = null;
//visit to next element
//like remove first node initial input list
this.input_list = sub_list.next;
var auxiliary_list: Node = this.input_list;
var item: Int = sub_list.element;
while (auxiliary_list != null)
{
if (auxiliary_list.element > item)
{
//Add node at end of sublist
tail.next = auxiliary_list;
item = auxiliary_list.element;
if (back == null)
{
//remove front node in actual list
this.input_list = auxiliary_list.next;
auxiliary_list = auxiliary_list.next;
}
else
{
auxiliary_list = auxiliary_list.next;
//remove intermediate element
back.next = auxiliary_list;
}
tail = tail.next;
}
else
{
back = auxiliary_list;
auxiliary_list = auxiliary_list.next;
}
}
// Separate the new sublist
tail.next = null;
return stander_sort(merge_list(output_list, sub_list));
}
//This are providing the environment setup to perform standard sort
def sort_element(collection: Array[Int], size: Int): Unit = {
if (size <= 1)
{
return;
}
//Loop controlling variable
var i: Int = 0;
//Create editable list
var output_list: Node = null;
//Some auxiliary variables
var tail: Node = null;
var node: Node = null;
//Find add array element into custom list
while (i < size)
{
node = new Node(collection(i));
if (this.input_list == null)
{
this.input_list = node;
}
else
{
tail.next = node;
}
tail = node;
i += 1;
}
output_list = stander_sort(output_list);
i = 0;
// Insert element into actual collection
while (output_list != null)
{
//Get current node
node = output_list;
//set element into collection
collection(i) = node.element;
//visit to next node
output_list = node.next;
node = null;
i += 1;
}
}
//Display element of given collection
def display_element(collection: Array[Int], size: Int): Unit = {
var i: Int = 0;
while (i < size)
{
print(" " + collection(i));
i += 1;
}
print("\n");
}
}
object Main
{
def main(args: Array[String]): Unit = {
var obj: StrandSort = new StrandSort();
// Define the unsorted array elements
var collection: Array[Int] = Array(7, 3, 0, 8, 23, 2, 9, 35, 13, 12, 1, 3);
//Get the size of given collection
var size: Int = collection.length;
print("\n Before sort : ");
obj.display_element(collection, size);
//sort collection element
obj.sort_element(collection, size);
print("\n After sort : ");
obj.display_element(collection, size);
}
}
Output
Before sort : 7 3 0 8 23 2 9 35 13 12 1 3
After sort : 0 1 2 3 3 7 8 9 12 13 23 35
/*
Swift Program
Strand Sort
*/
//Node of list element
class Node
{
var element: Int;
var next: Node? ;
init(_ data: Int)
{
self.element = data;
self.next = nil;
}
}
class StrandSort
{
//Merge two sorted list and return its result
func merge_list(_ list1: inout Node? , _ list2 : inout Node? ) -> Node?
{
if (list1 == nil)
{
//When list1 is empty
return list2;
}
else if (list2 == nil)
{
return list1;
}
else
{
//Some auxiliary variables
var head: Node? = nil;
var tail: Node? = nil;
var node: Node? = nil;
// Combine list elements in sorted order
// This process takes(m+n) time
// Here m is size of list1
// And n is size of list2
while (list1 != nil || list2 != nil)
{
if (list1 != nil && list2 != nil)
{
if (list1!.element < list2!.element)
{
node = list1;
list1 = list1!.next;
}
else
{
node = list2;
list2 = list2!.next;
}
}
else if (list1 != nil)
{
node = list1;
list1 = list1!.next;
}
else
{
node = list2;
list2 = list2!.next;
}
if (head == nil)
{
//When get first node of resultant list
head = node;
}
else
{
//Add node at end of resultant list
tail!.next = node;
}
node!.next = nil;
tail = node;
}
return head;
}
}
//Perform the standard sort of given list elements
func stander_sort(_ input_list: inout Node? , _ output_list : inout Node? ) -> Node?
{
if (input_list == nil)
{
return output_list;
}
//create new list and set first element of input list
var sub_list: Node? = input_list;
var tail: Node? = sub_list;
var back: Node? = nil;
//visit to next element
//like remove first node initial input list
input_list = sub_list!.next;
var auxiliary_list: Node? = input_list;
var item: Int = sub_list!.element;
while (auxiliary_list != nil)
{
if (auxiliary_list!.element > item)
{
//Add node at end of sublist
tail!.next = auxiliary_list;
item = auxiliary_list!.element;
if (back == nil)
{
//remove front node in actual list
input_list = auxiliary_list!.next;
auxiliary_list = auxiliary_list!.next;
}
else
{
auxiliary_list = auxiliary_list!.next;
//remove intermediate element
back!.next = auxiliary_list;
}
tail = tail!.next;
}
else
{
back = auxiliary_list;
auxiliary_list = auxiliary_list!.next;
}
}
// Separate the new sublist
tail!.next = nil;
output_list = self.merge_list(&output_list, &sub_list);
return self.stander_sort(&input_list, &output_list);
}
//This are providing the environment setup to perform standard sort
func sort_element(_ collection: inout[Int], _ size: Int)
{
if (size <= 1)
{
return;
}
//Loop controlling variable
var i: Int = 0;
//Create editable list
var input_list: Node? = nil;
var output_list: Node? = nil;
//Some auxiliary variables
var tail: Node? = nil;
var node: Node? = nil;
//Find add array element into custom list
while (i < size)
{
node = Node(collection[i]);
if (input_list == nil)
{
input_list = node;
}
else
{
tail!.next = node;
}
tail = node;
i += 1;
}
output_list = self.stander_sort(&input_list, &output_list);
i = 0;
// Insert element into actual collection
while (output_list != nil)
{
//Get current node
node = output_list;
//set element into collection
collection[i] = node!.element;
//visit to next node
output_list = node!.next;
node = nil;
i += 1;
}
}
//Display element of given collection
func display_element(_ collection: [Int], _ size: Int)
{
var i: Int = 0;
while (i < size)
{
print(" ", collection[i], terminator: "");
i += 1;
}
print("\n", terminator: "");
}
}
func main()
{
let obj: StrandSort = StrandSort();
// Define the unsorted array elements
var collection: [Int] = [7, 3, 0, 8, 23, 2, 9, 35, 13, 12, 1, 3];
//Get the size of given collection
let size: Int = collection.count;
print("\n Before sort : ", terminator: "");
obj.display_element(collection, size);
//sort collection element
obj.sort_element(&collection, size);
print("\n After sort : ", terminator: "");
obj.display_element(collection, size);
}
main();
Output
Before sort : 7 3 0 8 23 2 9 35 13 12 1 3
After sort : 0 1 2 3 3 7 8 9 12 13 23 35
Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.
New Comment