user7160329 user7160329 - 17 days ago 6
Java Question

Using Insertion Sort to sort an array

I'm supposed to take an array of the numbers: {51, 63, 48, 98, 75, 63, 92, 30, 32, 32, 36, 89, 4, 76, 73, 90, 64, 99, 36, 96} and sort them from lowest to highest, and then highest to lowest.

When I try to print the highest to lowest it makes the first output the same. Does anyone see any errors in my code?

package l7c14sort;

import java.util.Arrays;

public class L7C14Sort {

public static void main(String a[]){
int[] arr1 = {51, 63, 48, 98, 75, 63, 92, 30, 32, 32, 36, 89, 4, 76, 73, 90, 64, 99, 36, 96};


int[] arr2 = doInsertionSort(arr1);

int[] arr3 = doInsertionSortAgain(arr1);

System.out.println("Original input: "+Arrays.toString(arr1)+"\n");
System.out.println("Lowest to highest:\n");


for(int i:arr2)
{
System.out.print(i);
System.out.print(", ");

}
System.out.println("\n\n");
System.out.println("Highest to lowest:\n");

for(int k:arr3)
{
System.out.print(k);
System.out.print(", ");

}

System.out.println("\n");
}

public static int[] doInsertionSort(int[] input){

int temp;
for (int i = 1; i < input.length; i++) {
for(int j = i ; j > 0 ; j--){
if(input[j] < input[j-1]){
temp = input[j];
input[j] = input[j-1];
input[j-1] = temp;

}
}
}
return input;
}

public static int[] doInsertionSortAgain(int[] input2){

int temp2;
for (int k = 1; k < input2.length; k++) {
for(int j = k ; j > 0 ; j--){
if(input2[j] > input2[j-1]){
temp2 = input2[j];
input2[j] = input2[j-1];
input2[j-1] = temp2;

}
}
}

return input2;
}


}

Output:

Original input: [99, 98, 96, 92, 90, 89, 76, 75, 73, 64, 63, 63, 51,
48, 36, 36, 32, 32, 30, 4]


Lowest to highest:

99, 98, 96, 92, 90, 89, 76, 75, 73, 64, 63, 63, 51, 48, 36, 36, 32, 32, 30, 4,


Highest to lowest:

99, 98, 96, 92, 90, 89, 76, 75, 73, 64, 63, 63, 51, 48, 36, 36, 32, 32, 30, 4,

Answer

Good news: Your algorithm works fine.

In Java, arrays are passed by reference, not by value. What this means is that when you set int[] arr2 = doInsertionSort(arr1);, the array arr2 is being set to the result of your doInsertionSort method, which returns its input parameter after sorting it. Basically, arr1, arr2, arr3, input and input2 are all pointing to the very same array.

You have two easy options to fix the fact that you're printing:

  1. Restructure main() so that you use one array: print its contents, sort it lowest to highest, print its contents again, sort it highest to lowest, then print its contents again. (This is probably what your instructor intends for you to do, if this is coursework.)

  2. Make a copy of the input parameter to operate on. You can do this with System.arraycopy() like so:

    int[] myArray; System.arraycopy(input, 0, myArray, 0, input.length );

    Then, for option 2, you would need to edit your method to use myArray instead of input for every other time you use input.

As a note, you don't need to call your variables input2, temp2, etc. Just like i, j and k go out of scope and are forgotten after the end of a for loop, your variables input and temp mean nothing outside of the block you declared them in.

Hope this helps!