How it works
Pulls sorted "strands" from the input and merges them into the output list. Very efficient for partially sorted data.
Implementation
function strandSort(arr) { let input = [...arr], output = []; while (input.length > 0) { let sub = [input.shift()]; let i = 0; while (i < input.length) { if (input[i] >= sub[sub.length-1]) sub.push(input.splice(i, 1)[0]); else i++; } output = merge(output, sub); } return output; }
def strand_sort(arr): inp = list(arr) output = [] while inp: sub = [inp.pop(0)] i = 0 while i < len(inp): if inp[i] >= sub[-1]: sub.append(inp.pop(i)) else: i += 1 output = merge(output, sub) return output
void strandSort(vector<int>& arr) { list<int> input(arr.begin(), arr.end()); vector<int> output; while (!input.empty()) { vector<int> sub = { input.front() }; input.pop_front(); for (auto it = input.begin(); it != input.end();) if (*it >= sub.back()) { sub.push_back(*it); it = input.erase(it); } else ++it; merge(output.begin(), output.end(), sub.begin(), sub.end(), back_inserter(output)); } arr = output; }
List<int> StrandSort(List<int> arr) { var input = new List<int>(arr); var output = new List<int>(); while (input.Count > 0) { var sub = new List<int> { input[0] }; input.RemoveAt(0); for (int i = 0; i < input.Count;) if (input[i] >= sub[^1]) { sub.Add(input[i]); input.RemoveAt(i); } else i++; output = Merge(output, sub); } return output; }
void strandSort(int arr[], int n) { int output[n], oLen = 0; int input[n], iLen = n; memcpy(input, arr, n * sizeof(int)); while (iLen > 0) { int sub[n], sLen = 1; sub[0] = input[0]; memmove(input, input+1, (--iLen)*sizeof(int)); for (int i = 0; i < iLen;) if (input[i] >= sub[sLen-1]) { sub[sLen++] = input[i]; memmove(input+i, input+i+1, (--iLen-i)*sizeof(int)); } else i++; merge(output, oLen, sub, sLen); } memcpy(arr, output, n * sizeof(int)); }