class Sorter<T extends Comparable<T>> { private T[] seq; private T[] sortedSeq() { System.out.println(); return seq; } private void swap(int i, int j) { T tmp = seq[i]; seq[i] = seq[j]; seq[j] = tmp; } private boolean wereSwapped(int i, int j) { if (seq[i].compareTo(seq[j]) > 0) { swap(i, j); System.out.print("s"); return true; } System.out.print("."); return false; } public T[] bubbleSortSilly(T[] array) { seq = array; boolean done = false; while (!done) { done = true; for (int i = 0; i < seq.length - 1; i++) { if (wereSwapped(i, i + 1)) { done = false; } } } return sortedSeq(); } public T[] bubbleSort(T[] array) { seq = array; for (int j = seq.length - 1; j > 0; j--) { for (int i = 0; i < j; i++) { wereSwapped(i, i + 1); } } return sortedSeq(); } public T[] bubbleSortSmart(T[] array) { seq = array; boolean done = false; for (int j = seq.length - 1; !done && j > 0; j--) { done = true; for (int i = 0; i < j; i++) { if (wereSwapped(i, i + 1)) { done = false; } } } return sortedSeq(); } public T[] bubbleSortSmarter(T[] array) { seq = array; int k; for (int j = seq.length - 1; j > 0; j = k) { k = 0; for (int i = 0; i < j; i++) { if (wereSwapped(i, i + 1)) { k = i; } } } return sortedSeq(); } } class Printer<T> { public void print(T[] array) { for (int i = 0; i < array.length; i++) { if (i > 0) { System.out.print(" "); } System.out.print(array[i]); } System.out.println(); } public void println(T[] array) { print(array); System.out.println(); } } class StringCopier { public String[] copy(String[] array) { int i = array.length; String[] copyOfArray = new String[i]; while (--i >= 0) { copyOfArray[i] = array[i]; } return copyOfArray; } } public class BubbleSort { public static void main(String[] args) { String[] array = (args.length > 0) ? args : new String[] { "503", "087", "512", "061", "908", "170", "897", "275", "653", "426", "154", "509", "612", "677", "765", "703" }; StringCopier copier = new StringCopier(); Printer<String> printer = new Printer<String>(); Sorter<String> sorter = new Sorter<String>(); printer.println(array); printer.println(sorter.bubbleSortSilly(copier.copy(array))); printer.println(sorter.bubbleSort(copier.copy(array))); printer.println(sorter.bubbleSortSmart(copier.copy(array))); printer.println(sorter.bubbleSortSmarter(copier.copy(array))); } }