![]() |
VOOZH | about |
A sorting algorithm is said to be stable if it maintains the relative order of records in the case of equality of keys.
Input : (1, 5), (3, 2) (1, 2) (5, 4) (6, 4)
We need to sort key-value pairs in the increasing order of keys of first digitThere are two possible solution for the two pairs where the key is same i.e. (1, 5) and (1, 2) as shown below:
OUTPUT1: (1, 5), (1, 2), (3, 2), (5, 4), (6, 4)
OUTPUT2: (1, 2), (1, 5), (3, 2), (5, 4), (6, 4)A stable algorithm produces first output. You can see that (1, 5) comes before (1, 2) in the sorted order, which was the original order i.e. in the given input, (1, 5) comes before (1, 2).
Second output can only be produced by an unstable algorithm. You can see that in the second output, the (1, 2) comes before (1, 5) which was not the case in the original input.
Some sorting algorithms are stable by nature like Insertion sort, Merge Sort, Bubble Sort, etc. And some sorting algorithms are not, like Heap Sort, Quick Sort, etc.
QuickSort is an unstable algorithm because we do swapping of elements according to pivot's position (without considering their original positions).
How to make QuickSort stable?
Quicksort can be stable but it typically isn’t implemented that way. Making it stable either requires order N storage (as in a naive implementation) or a bit of extra logic for an in-place version.
In below implementation, we use extra space.
The idea is to make two separate lists:
Implementation:
[1, 5, 7, 8, 9, 10]
In above code, we have intentionally used middle element as a pivot to demonstrate how to consider a position as part of the comparison. Code simplifies a lot if we use last element as pivot. In the case of last element, we can always push equal elements in the smaller list.
Auxiliary Space : O(n) for the auxiliary arrays that we create. Recursion might also take upto O(n) time if one part is empty in every recursive call.