diff --git a/Sorts/SwapSort.java b/Sorts/SwapSort.java new file mode 100644 index 000000000..c6ab1a516 --- /dev/null +++ b/Sorts/SwapSort.java @@ -0,0 +1,67 @@ +package Sorts; + +import static Sorts.SortUtils.*; + +/** + * The idea of Swap-Sort is to count the number m of smaller values (that are in + * A) from each element of an array A(1...n) and then swap the element with the + * element in A(m+1). This ensures that the exchanged element is already in the + * correct, i.e. final, position. The disadvantage of this algorithm is that + * each element may only occur once, otherwise there is no termination. + */ +public class SwapSort implements SortAlgorithm { + + @Override + public > T[] sort(T[] array) { + int LENGTH = array.length; + int index = 0; + + while (index < LENGTH - 1) { + int amountSmallerElements = this.getSmallerElementCount(array, index); + + if (amountSmallerElements > 0 && index != amountSmallerElements) { + T element = array[index]; + array[index] = array[amountSmallerElements]; + array[amountSmallerElements] = element; + } else { + index++; + } + } + + return array; + } + + private > int getSmallerElementCount(T[] array, int index) { + int counter = 0; + for (int i = 0; i < array.length; i++) { + if (less(array[i], array[index])) { + counter++; + } + } + + return counter; + } + + public static void main(String[] args) { + // ==== Int ======= + Integer[] a = { 3, 7, 45, 1, 33, 5, 2, 9 }; + System.out.print("unsorted: "); + print(a); + System.out.println(); + + new SwapSort().sort(a); + System.out.print("sorted: "); + print(a); + System.out.println(); + + // ==== String ======= + String[] b = { "banana", "berry", "orange", "grape", "peach", "cherry", "apple", "pineapple" }; + System.out.print("unsorted: "); + print(b); + System.out.println(); + + new SwapSort().sort(b); + System.out.print("sorted: "); + print(b); + } +}