SELECTION SORT

'Selection sort' is a sorting algorithm, specifically an in-place comparison sort. It has Θ(''n''2) complexity, making it inefficient on large lists, and generally performs worse than the similar insertion sort. Selection sort is noted for its simplicity, and also has performance advantages over more complicated algorithms in certain situations. It works as follows:
# Find the minimum value in the list
# Swap it with the value in the first position
# Repeat the steps above for remainder of the list (starting at the second position)
__NOTOC__
Effectively, we divide the list into two parts: the sublist of items already sorted, which we build up from left to right and is found at the beginning, and the sublist of items remaining to be sorted, occupying the remainder of the array.
Here is an example of this sort algorithm sorting five elements:

31 25 12 22 11
11 25 12 22 31
11 12 25 22 31
11 12 22 25 31

Selection sort can also be used on list structures that make add and remove efficient, such as a linked list. In this case it's more common to ''remove'' the minimum element from the remainder of the list, and then ''insert'' it at the end of the values sorted so far. For example:

31 25 12 22 11
11 31 25 12 22
11 12 31 25 22
11 12 22 31 25
11 12 22 25 31


Contents
Implementation
Analysis
Comparison to other Sorting Algorithms
Variants
References
External links

Implementation


The following is a C/C++ implementation, which makes use of a swap function:

void selectionSort(int a[], int size)
{
int i, j, min;
for (i = 0; i < size - 1; i++)
{
min = i;
for (j = i+1; j < size; j++)
{
if (a[j] < a[min])
{
min = j;
}
}
swap(a[i], a[min]);
}
}

Python example:

def selection_sort(A):
for i in range(0, len(A)-1):
min = A[i]
pos = i
for j in range(i+1, len(A)):
if( A[j] < min ):
min = A[j]
pos = j
A[pos] = A[i]
A[i] = min

Analysis


Selection sort is not difficult to analyze compared to other sorting algorithms since none of the loops depend on the data in the array. Selecting the lowest element requires scanning all ''n'' elements (this takes ''n'' - 1 comparisons) and then swapping it into the first position. Finding the next lowest element requires scanning the remaining ''n'' - 1 elements and so on, for (''n'' - 1) + (''n'' - 2) + ... + 2 + 1 = ''n''(''n'' - 1) / 2 = Θ(''n''2) comparisons (see arithmetic progression). Each of these scans requires one swap for ''n'' - 1 elements (the final element is already in place). Thus, the comparisons dominate the running time, which is Θ(''n''2).

Comparison to other Sorting Algorithms


Among simple average-case Θ(''n''2) algorithms, selection sort always outperforms bubble sort and gnome sort, but is generally outperformed by insertion sort. Insertion sort is very similar in that after the ''k''th iteration, the first ''k'' elements in the array are in sorted order. Insertion sort's advantage is that it only scans as many elements as it needs to in order to place the ''k'' + 1st element, while selection sort must scan all remaining elements to find the ''k'' + 1st element.
Simple calculation shows that insertion sort will therefore usually perform about half as many comparisons as selection sort, although it can perform just as many or far fewer depending on the order the array was in prior to sorting. It can be seen as an advantage for some real-time applications that selection sort will perform identically regardless of the order of the array, while insertion sort's running time can vary considerably. However, this is more often an advantage for insertion sort in that it runs much more efficiently if the array is already sorted or "close to sorted."
Another key difference is that selection sort always performs Θ(''n'') swaps, while insertion sort performs Θ(''n''2) swaps in the average and worst cases. Because swaps require writing to the array, selection sort is preferable if writing to memory is significantly more expensive than reading, such as when dealing with an array stored in EEPROM or Flash.
Finally, selection sort is greatly outperformed on larger arrays by Θ(nlog ''n'') divide-and-conquer algorithms such as quicksort and mergesort. However, insertion sort or selection sort are both typically faster for small arrays (ie less than 10-20 elements). A useful optimization in practice for the recursive algorithms is to switch to insertion sort or selection sort for "small enough" sublists.

Variants


Heapsort greatly improves the basic algorithm by using an implicit heap data structure to speed up finding and removing the lowest datum. If implemented correctly, the heap will allow finding the next lowest element in Θ(log ''n'') time instead of Θ(''n'') for the inner loop in normal selection sort, reducing the total running time to Θ(''n''  log ''n'').
A bidirectional variant of selection sort, called cocktail sort, is an algorithm which finds both the minimum and maximum values in the list in every pass. This reduces the number of scans of the list by a factor of 2, eliminating some loop overhead but not actually decreasing the number of comparisons or swaps. Note, however, that 'cocktail sort' more often refers to a bidirectional variant of bubble sort.
Selection sort can be implemented as a stable sort. If, rather than swapping in step 2, the minimum value is inserted into the first position (that is, all intervening items moved down), the algorithm is stable. However, this modification leads to Θ(''n''2 ) writes, eliminating the main advantage of selection sort over insertion sort, which is always stable.

References



Donald Knuth. ''The Art of Computer Programming'', Volume 3: ''Sorting and Searching'', Third Edition. Addison-Wesley, 1997. ISBN 0-201-89685-0. Pages 138–141 of Section 5.2.3: Sorting by Selection.

External links



Analyze Selection Sort in an online JavaScript IDE

Selection Sort Java Applet

Selection Sort in C++

Selection Sort Demo

Selection Sort Demo

Selection Sort Demonstration

★ Pointers to selection sort visualizations

C++ Program - Selection Sort

Selection sort explained and C++ source code

This article provided by Wikipedia. To edit the contents of this article, click here for original source.

psst.. try this: add to faves