I’ve been reading on in place sorting algorithm to sort linked lists. As per Wikipedia
Merge sort is often the best choice for sorting a linked list: in this situation it is relatively easy to implement a merge sort in such a way that it requires only
Θ(1)extra space, and the slow random-access performance of a linked list makes some other algorithms (such as quicksort) perform poorly, and others (such as heapsort) completely impossible.
To my knowledge, the merge sort algorithm is not an in place sorting algorithm, and has a worst case space complexity of O(n) auxiliary. Now, with this taken into consideration, I am unable to decide if there exists a suitable algorithm to sort a singly linked list with O(1) auxiliary space.
As pointed out by Fabio A. in a comment, the sorting algorithm implied by the following implementations of merge and split in fact requires O(log n) extra space in the form of stack frames to manage the recursion (or their explicit equivalent). An O(1)-space algorithm is possible using a quite different bottom-up approach.
Here’s an O(1)-space merge algorithm that simply builds up a new list by moving the lower item from the top of each list to the end of the new list:
It’s possible to avoid the pointer-to-pointer
pby special-casing the first item to be added to the output list, but I think the way I’ve done it is clearer.Here is an O(1)-space split algorithm that simply breaks a list into 2 equal-sized pieces:
Notice that
halfis only moved forward half as many times asinis. Upon this function’s return, the list originally passed asinwill have been changed so that it contains just the first ceil(n/2) items, and the return value is the list containing the remaining floor(n/2) items.