2016-11-21 6 views
0

Я должен взять массив чисел: {51, 63, 48, 98, 75, 63, 92, 30, 32, 32, 36, 89, 4, 76 , 73, 90, 64, 99, 36, 96} и сортировать их от самого низкого до самого высокого, а затем от самого высокого до самого низкого.Использование вставки Сортировка сортировки массива

Когда я пытаюсь напечатать наивысшую до самой низкой, он делает первый выход тем же. Кто-нибудь видит какие-либо ошибки в моем коде?

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; 
} 

}

Выход:

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

высшего к низшему:

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

низкого до самого высокого:

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

ответ

1

Хорошая новость: ваш алгоритм работает отлично.

В Java массивы передаются по ссылке, а не по значению. Это означает, что при установке int[] arr2 = doInsertionSort(arr1); массив arr2 устанавливается на результат вашего метода doInsertionSort, который возвращает его input после сортировки. В основном, arr1, arr2, arr3, input и input2 все указывают на тот же массив.

У вас есть два простых вариантов, чтобы исправить то, что вы печатаете:

  1. main() так Реструктуризация, что вы используете один массив: напечатать его содержимое, разбирайтесь низшего к высшему, распечатать его содержимое снова, сортируйте его по максимуму до самого низкого, затем распечатайте его содержимое снова. (Это, вероятно, ваш инструктор намеревается сделать для вас, если это курсовая работа.)

  2. Сделайте копию параметра input для работы. Вы можете сделать это с System.arraycopy() так:

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

    Тогда для варианта 2, вы должны изменить способ, чтобы использовать myArray вместо input для любого другого времени вы используете input.

Как примечание, вы не должны называть свои переменные input2, temp2 и т.д. Так же, как i, j и k выходить из сферы и забываются после конца for цикла, переменные input и temp ничего не значат за пределами блока, в котором вы их объявили.

Надеюсь, это поможет!

0

Вы получили те же результаты, что и массивы. Из-за следующего кода входной массив мутируется и выводится его окончательное значение (от самого высокого до самого низкого).

int[] arr2 = doInsertionSort(arr1); 

int[] arr3 = doInsertionSortAgain(arr1); 

Если вам организовать ваш код, как:

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}; 

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

int[] arr2 = doInsertionSort(arr1); 


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

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

int[] arr3 = doInsertionSortAgain(arr1); 

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

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

}

Вы собираетесь получить:

Оригинальный вход: [51, 63, 48, 98, 75, 63, 92, 30, 32, 32, 36, 89, 4, 76, 73, 90, 64, 99, 36, 96]

Lowes t до наивысшего значения: 4, 30, 32, 32, 36, 36, 48, 73, 75, 76, 89, 90, 92, 96, 98, 99,

Высшее до минимума: 99, 98, 96, 92, 90, 89, 76, 75, 73, 64, 63, 63, 51, 48, 36, 36, 32, 32, 30, 4,