Handles QuickSort and all of its methods.
//package sortcomparisons; import java.util.Random; /** * Handles QuickSort and all of its methods. * * @author Alex Laird * @version 1.0 */ public class QuickSort { // object pointer delcarations private static final Random random = new Random(); /** * Swaps the two indeces in the array given. * * @param array The array to perform the swap on. * @param first The first index to swap. * @param second The second index to swap. */ private void swap(int[] array, int first, int second) { // swap array[i] and array[j] int temp = array[first]; array[first] = array[second]; array[second] = temp; } /** * Finds the most logical point to split the array in two parts and uses * that point as the partition. Uses a for loop to evaluate the partition. * * @param array The array to be sorted. * @param low The lowest index. * @param high The highest index. * @return The index of the partitioning point. */ private int partitionUsingFor(int[] array, int low, int high) { // get the value of the pivot element int pivot = array[high]; // the low pointer int i = low - 1; for(int j = low; j < high; ++j) { // if the value at the current index in the array is smaller than the pivot, swap them if(array[j] <= pivot) { i = ++i; // swap array[i] and array[j] swap(array, i, j); } } // increment the low pointer ++i; // swap array[i] and array[high] swap(array, i, high); return i; } /** * Finds the most logical point to split the array in two parts and uses * that point as the partition. Uses a while loop to evaluate the partition. * * @param array The array to be sorted. * @param low The lowest index. * @param high The highest index. * @return The index of the partitioning point. */ private int partitionUsingWhile(int[] array, int low, int high) { int pivot = array[low]; int left = low; int right = high; while(left < right) { // increment the low pointer until you meet the pivot while(left <= right && array[left] <= pivot) { ++left; } // decrement the high pointer until you meet the pivot while(left <= right && array[right] > pivot) { --right; } // if the pointers have crossed, swap the items if(left < right) { // swap array[left] with array[right] swap(array, left, right); } } array[low] = array[right]; array[right] = pivot; return right; } /** * Generates the random partition location and calls the partition method. * Uses a for loop to evaluate the partition. * * @param array The array to be sorted. * @param low The lowest index. * @param high The highest index. * @return The index of the randomly generated partition. */ private int randomizedPartitionUsingFor(int[] array, int low, int high) { // some random int between low and high int i = random.nextInt(high - low + 1) + low; // swap array[high] and array[i] swap(array, high, i); return partitionUsingFor(array, low, high); } /** * Generates the random partition location and calls the partition method. * Uses a while loop to evaluate the partition. * * @param array The array to be sorted. * @param low The lowest index. * @param high The highest index. * @return The index of the randomly generated partition. */ private int randomizedPartitionUsingWhile(int[] array, int low, int high) { // some random int between low and high int i = random.nextInt(high - low + 1) + low; // swap array[high] and array[i] swap(array, high, i); return partitionUsingWhile(array, low, high); } /** * Performs a recursive QuickSort algorithm on an array from low to high, but * does so by selecting randomized indeces for the partitions. Uses a for * loop to evaluate the partition. * * @param array The array to be sorted. * @param low The lowest index. * @param high The highest index. */ public void sortRandomizedPartitionUsingFor(int[] array, int low, int high) { if(low < high) { // randomly locate a partition point int mid = randomizedPartitionUsingFor(array, low, high); // recursively sort the lower portion sortRandomizedPartitionUsingFor(array, low, mid - 1); // recursively sort the upper portion sortRandomizedPartitionUsingFor(array, mid + 1, high); } } /** * Performs a recursive QuickSort algorithm on an array from low to high, but * does so by selecting randomized indeces for the partitions. Uses a while * loop to evaluate the partition. * * @param array The array to be sorted. * @param low The lowest index. * @param high The highest index. */ public void sortRandomizedPartitionUsingWhile(int[] array, int low, int high) { if(low < high) { // randomly locate a partition point int mid = randomizedPartitionUsingWhile(array, low, high); // recursively sort the lower portion sortRandomizedPartitionUsingWhile(array, low, mid - 1); // recursively sort the upper portion sortRandomizedPartitionUsingWhile(array, mid + 1, high); } } /** * Performs a standard recursive QuickSort algorithm on an array from high * to low. Uses a for loop to evaluate the partition. * * @param array The array to be sorted. * @param low The lowest index. * @param high The highest index. */ public void sortUsingFor(int[] array, int low, int high) { if(low < high) { // locate the most precise partition point int mid = partitionUsingFor(array, low, high); // recursively sort the lower half sortUsingFor(array, low, mid - 1); // recursively sort the upper half sortUsingFor(array, mid + 1, high); } } /** * Performs a standard recursive QuickSort algorithm on an array from high * to low. Uses a while loop to evaluate the partition. * * @param array The array to be sorted. * @param low The lowest index. * @param high The highest index. */ public void sortUsingWhile(int[] array, int low, int high) { if(low < high) { // locate the most precise partition point int mid = partitionUsingWhile(array, low, high); // recursively sort the lower half sortUsingWhile(array, low, mid - 1); // recursively sort the upper half sortUsingWhile(array, mid + 1, high); } } }