diff --git a/src/main/java/net/abhinavsarkar/Algorist.java b/src/main/java/net/abhinavsarkar/Algorist.java index f49ee86..f8ef87d 100644 --- a/src/main/java/net/abhinavsarkar/Algorist.java +++ b/src/main/java/net/abhinavsarkar/Algorist.java @@ -9,6 +9,12 @@ public class Algorist // Hash Table - open addressing and chaining // Linked BST // Ranked BST + // Heapsort + // selection sort + // insertion sort + // merge sort + // quick sort + // binary search diff --git a/src/main/java/net/abhinavsarkar/algorist/sort/InsertionSorter.java b/src/main/java/net/abhinavsarkar/algorist/sort/InsertionSorter.java index fc5e66b..ff7327c 100644 --- a/src/main/java/net/abhinavsarkar/algorist/sort/InsertionSorter.java +++ b/src/main/java/net/abhinavsarkar/algorist/sort/InsertionSorter.java @@ -22,6 +22,10 @@ public class InsertionSorter implements Sorter private void swap(T[] input, int i, int j) { + if (i == j) { + return; + } + T temp = input[i]; input[i] = input[j]; input[j] = temp; diff --git a/src/main/java/net/abhinavsarkar/algorist/sort/QuickSorter.java b/src/main/java/net/abhinavsarkar/algorist/sort/QuickSorter.java new file mode 100644 index 0000000..ddd2f87 --- /dev/null +++ b/src/main/java/net/abhinavsarkar/algorist/sort/QuickSorter.java @@ -0,0 +1,79 @@ +package net.abhinavsarkar.algorist.sort; + +import java.util.Arrays; +import java.util.concurrent.ThreadLocalRandom; +import net.abhinavsarkar.algorist.Sorter; + +public class QuickSorter implements Sorter +{ + private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current(); + + @Override + public T[] sort(T[] input, Comparator comparator) + { + if (input.length <= 1) { + return input; + } + + shuffle(input); + return sort(input, 0, input.length, comparator); + } + + private void shuffle(T[] input) + { + for (int i = input.length - 1; i > 0; i--) { + int j = RANDOM.nextInt(i + 1); + swap(input, i, j); + } + } + + private T[] sort(T[] input, int start, int end, Comparator comparator) + { + if (end - start <= 1) { + return input; + } + + int pivot = partition(input, start, end, comparator); + sort(input, start, pivot, comparator); + sort(input, pivot, end, comparator); + return input; + } + + private int partition(T[] input, int start, int end, Comparator comparator) + { + int pivot = end - 1; + int firstHigh = start; + for (int i = start; i < pivot; i++) + { + if (comparator.compare(input[i], input[pivot]) < 0) { + swap(input, i, firstHigh); + firstHigh++; + } + } + swap(input, pivot, firstHigh); + + return firstHigh; + } + + private void swap(T[] input, int i, int j) + { + if (i == j) { + return; + } + T temp = input[i]; + input[i] = input[j]; + input[j] = temp; + } + + public static void main(String[] args) + { + Sorter sorter = new QuickSorter<>(); + String[] sorted = + sorter.sort(new String[]{ + "abhinav", "sarkar", "barista", "jordan", "data", + "cata", "meta", "dota", "best", "recursion"}, + (s, anotherString) -> anotherString.compareTo(s)); + System.out.println(Arrays.toString(sorted)); + } + +} diff --git a/src/main/java/net/abhinavsarkar/algorist/sort/SelectionSorter.java b/src/main/java/net/abhinavsarkar/algorist/sort/SelectionSorter.java index c1c310f..50d5bb0 100644 --- a/src/main/java/net/abhinavsarkar/algorist/sort/SelectionSorter.java +++ b/src/main/java/net/abhinavsarkar/algorist/sort/SelectionSorter.java @@ -29,6 +29,10 @@ public class SelectionSorter implements Sorter private void swap(T[] input, int i, int j) { + if (i == j) { + return; + } + T temp = input[i]; input[i] = input[j]; input[j] = temp;