Selection Sort: The Code

  • Understand the implementation of selection sort.
  • Understand the use and operations of the SortingAlgorithm interface.
  • Understand the use and operation of Java's Comparable interface.

Please download the starter code for this chapter.

Here is how we have implemented selection sort:

/** * The basic Selection Sort algorithm. * * @param <T> Element type. */ public final class SelectionSort<T extends Comparable<T>> implements SortingAlgorithm<T> { // is a less than b? private boolean less(T a, T b) { return a.compareTo(b) < 0; } @Override public void sort(IndexedList<T> indexedList) { // We try to put "correct" values into a[0], a[1], ... a[n-2]; // once a "correct" value is in a[n-2], the very last value // has to be the largest one anyway; thus it's also "correct". for (int i = 0; i < indexedList.length() - 1; i++) { // We're trying to put the "correct" element in a[i]. // We need to find the smallest element in a[i..n-1]. // We start by assuming a[i] is the smallest one. int min = i; // Now we try to find a smaller one in a[i+1..n-1]. for (int j = i + 1; j < indexedList.length(); j++) { if (this.less(indexedList.get(j), indexedList.get(min))) { min = j; } } // Now we have the "true" minimum at a[min], and we // swap it with a[i], unless i == min of course. if (min != i) { T t = indexedList.get(i); indexedList.put(i, indexedList.get(min)); indexedList.put(min, t); } } } @Override public String name() { return "Selection Sort"; } }
Frequently asked questions!

Q: Why SelectionSort implements SortingAlgorithm?

Answer

SortingAlgorithm is an interface we provided which encapsulates the essence of a sorting algorithm:

public interface SortingAlgorithm<T extends Comparable<T>> { void sort(IndexedList<T> list); String name(); }

Given an object of SortingAlgorithm, we can (a) ask it to sort a given IndexedList and (b) ask it for its name (e.g., "Selection Sort").

Q: Why the generic parameter T extends Comparable<T>?

Answer

Things to be sorted need an order, and we need a way to compare items, not just for equality (there's an equals() method on all objects) but for less-than and greater-than as well.

Therefore, we need a bounded type parameter. The elements to be sorted (of type T) must be Comparable. That, in turn, ensures that we have a method compareTo() that we can use to establish order.

Q: What is Comparable?

Answer

It is an interface in Java.

public interface Comparable<T> { /** * Compares this object with the specified object for order. * * @param o the object to be compared. * @return a negative integer, zero, or a positive integer * as this object is less than, equal to, or greater * than the specified object. */ int compareTo(T o); }
  • Most Java built-in types implement Comparable (e.g. String, Integer, etc.)

  • We implement this interface in many classes, particularly if we want to sort a collection of their objects.

See Comparable on Oracle's website for more.

Q: Why is there a less method?

Answer

The less method encapsulates the notion of comparing two elements: "is a less than b?". It simply makes for a more readable code that is easier to update if the notion of "<<" changes.