# C++ Notes: Algorithms: Sorting

Arranging elements in some order is called *sorting*. Typically
this is an operation applied to arrays or other indexable data structures.
**Warning to students**. Professional programmers do not write
their own sorts functions. Why? They use the `sort()`

function
in the `<algorithm>`

part of the STL library because

- It
*saves programming time* (your reputation and your customer's money).
*It's correct*. It's surprisingly easy to write a sort with unobvious bugs.
*It's efficient*. Writing a sort that is as fast would be unlikely.

Is the time spent in classes studying sorting wasted?
Sorting provides a lot of programming practice, and is considered
a good introduction to Big-Oh issues. So maybe it's worth the class time.
But take a look at STL sort for arrays for an introduction
to using the library sort function.

## Introductory Sorts - bubble sort and selection sort

Perhaps the two most common sorts for introducing sorting are
*bubble sort* and *selection sort*. Both are
simple and adequate for small amounts of data.
Their O(n2) performance is not acceptible for large data sets.
For faster sorts, O(n log n), already implemented in the library,
should be used.
## Bubble sort

Bubble sort compares two values next to each other and exchanges them
if necessary to put them in the correct order. There are many variations on
bubble sort, but they all examine adjacent pairs.
Students like bubble sorts -- could it be the name or the
intuitive algorithm? Instructors also like bubble sorts, perhaps
for the many interesting programming variations. However, the sad
truth is that they often aren't very efficient. They should only be used
with small arrays or almost sorted data.

## Selection sort

Selection sort successively choses the largest (or smallest) value remaining in the
array. While the performance on the average may be no better than bubble sort,
it does allow for a significant reduction in the number of swaps, which can
have a good performance effect on cache memory usage. On the other hand, it can not
finish early if the data is already sorted.
## Faster sorts

[TO DO - explain a little about the O(n log n) sorts, such as introsort, quicksort, heapsort, ...]
## Using the STL sort

The `sort()`

function in the STL library can be used with
arrays and other data collections. The only description in these
notes is STL sort for arrays.
## Stable sorts

[TO DO]