Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

In Java, I\'m trying to implement an iterative(non-recursive) quicksort for a gi

ID: 3848626 • Letter: I

Question

In Java, I'm trying to implement an iterative(non-recursive) quicksort for a given generic array, and then present that array in order from least to greatest. From debugging process it seems my quicksort is using the index's of the numbers and not the elements themselvs while sorting. Any advice on my code would be appreciated! There is also test code provided.

//MAIN CODE

import java.util.Stack;

public class QuickSort{
  
     

   // provide non-recursive version of quick sort
   // hint: use stack to stored intermediate results
   public static <T extends Comparable<T>> void sort(T[] a) {
       Stack<Integer> stack = new Stack<Integer>();
       stack.push(0);
       stack.push(a.length);
      
       while (!stack.isEmpty())
       {
           int lo = stack.pop();
           int hi = stack.pop();
           if (lo - hi < 2) {
               continue;
           }
           int j = lo + ((hi - lo) / 2);
           j = partition(a, lo, hi);
           stack.push(j + 1);
           stack.push(hi);
           stack.push(lo);
           stack.push(j);
           }
       return;
       }
  
  
  

   // Partitions into a[lo..j-1], a[j], a[j+1..hi]
   private static <T extends Comparable<T>> int partition(T[] a, int lo, int hi) {
       int i = lo, j = hi + 1; // left and right scan indices
       T v = a[lo]; // the pivot

       while (true) { // Scan right, scan left, check for scan complete, and exchange
           while (SortUtils.isLessThan(a[++i], v)) {//++i is evaluated to i+1
               if (i == hi) {
                   break;
               }
           }
           while (SortUtils.isLessThan(v, a[--j])) {//--j is evaluated to j-1
               if (j == lo) {
                   break;
               }
           }
           if (i >= j) {
               break;
           }

           SortUtils.swap(a, i, j);
       }

       SortUtils.swap(a, lo, j); // Put v = a[j] into position
       return j;
   }

}

//TEST CODE

import org.junit.Assert;
import org.junit.Test;

public class QuickSortTest {

   @Test
   public void testSort1() {
       Integer[] a = {17};
       Integer[] expected = {17};
       QuickSort.sort(a);
       Assert.assertArrayEquals(expected, a);
   }
  
   @Test
   public void testSort2() {
       Integer[] a = {17, 5};
       Integer[] expected = {5, 17};
       QuickSort.sort(a);
       Assert.assertArrayEquals(expected, a);
   }
  
   @Test
   public void testSort3() {
       Integer[] a = {64, 18, 74, 89, 58, 17, 48, 44, 92, 88, 78, 80, 75, 25, 77, 18, 39, 95, 11, 2};
       Integer[] expected = {2, 11, 17, 18, 18, 25, 39, 44, 48, 58, 64, 74, 75, 77, 78, 80, 88, 89, 92, 95};
       QuickSort.sort(a);
       Assert.assertArrayEquals(expected, a);
   }


}

Explanation / Answer

import org.junit.Assert;
import org.junit.Test;
package com.java2novice.sorting;

public class MyQuickSort {
   
    private int array[];
    private int length;

    public void sort(int[] inputArr) {
       
        if (inputArr == null || inputArr.length == 0) {
            return;
        }
        this.array = inputArr;
        length = inputArr.length;
        quickSort(0, length - 1);
    }

    private void quickSort(int lowerIndex, int higherIndex) {
       
        int i = lowerIndex;
        int j = higherIndex;
        int pivot = array[lowerIndex+(higherIndex-lowerIndex)/2];
        while (i <= j) {
            while (array[i] < pivot) {
                i++;
            }
            while (array[j] > pivot) {
                j--;
            }
            if (i <= j) {
                exchangeNumbers(i, j);
                i++;
                j--;
            }
        }
        if (lowerIndex < j)
            quickSort(lowerIndex, j);
        if (i < higherIndex)
            quickSort(i, higherIndex);
    }

    private void exchangeNumbers(int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
   
    public static void main(String a[]){
       
        MyQuickSort sorter = new MyQuickSort();
        int[] input = {24,2,45,20,56,75,2,56,99,53,12};
        sorter.sort(input);
        for(int i:input){
            System.out.print(i);
            System.out.print(" ");
        }
    }
}

Output:
2 2 12 20 24 45 53 56 56 75 99

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote