Sorting algorithms
Let's we have some collection of elements, for example array of integers.
5, 25, 36, 100, 75, 0, 23, 80, 90, 7
Our task is to sort this array to get the result
0, 5, 7, 23, 25, 36, 75, 80, 90, 100
If you need an algorithm implementation for objects and lists see full source Sort.java.
quick sort
In most cases this algorithm gives the best results.
The basic idea is to select any element within the range [ind1; indn], for example middle element M. Then move all elements that are greater than M to the right side, and all elements that are less than M to the left side.
- search first element that less (or equal) than M within range [M; indn]
- search first element that greater (or equal) than M within range [ind1; M]
- swap found elements
- continue from the first step until no more elements are found
After that, we repeat the algorithm recursively for two new ranges, the boundaries of which are [ind1; M] and [M; indn]
Time complexity is O(n*log(n)), in worst case O(n2).
buble sort
This is most simple and lower algorithm. But in essence, quicksort is a modification of this method.
The basic idea is to swap two neighbor elements if they don't match the sorting conditions. Thus most greatest element will be at end (or begin) after first pass.
Time complexity is O(n2).
insertion sort
The basic idea here is to insert the next unsorted element into the desired position of an already sorted range.
- sort the first two elements
- take the third element and insert it in the right place
- apply step 2 to the fourth element and so on
Time complexity is O(n2), in best case O(n).
Shell sort
The main idea here is to use the insert method on a part of the collection being sorted. For example, on the first pass, process every sixteenth element. On the second pass, every eighth element. And only on the last pass, use the usual insertion sort.
In addition to the sequence shown (..., 16,8,4,2,1), other sequences can be used, for example, N/2, N/4, …, 1 where N length of collection.
selection sort
In this algorithm, the main idea is to find the smallest or largest element in each pass and swap it with the first or last unsorted element depending on the sort condition.
other
There are other sorting methods, like pyromidal and merge