Метод сортировки выбора не работает? - PullRequest
0 голосов
/ 08 мая 2018

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

Требуемый вывод: [2.0, 3.7, 6.2, 7.4, 8.1, 8.5, 9.9, 15.7]

Фактический вывод: [7.4, 2.0, 3.7, 6.2,8.1, 8.5, 9.9, 15.7]

Объяснение кода: метод findMax находит индекс самого большого объекта в массиве, а процесс метода использует метод findMax, чтобы найти индекс наибольшего числа и заменить егос последним, вторым по последнему, третьим с последним и т. д., чтобы упорядочить массив.

Мой код:

import java.util.Arrays;
   import java.io.*;
    public class Driver01
   {
       public static void main(String[] args)
      {
        //input
         double[] myArray = {2.0, 3.7, 9.9, 8.1, 8.5, 7.4, 15.7, 6.2};

        //sort the array
         double[] sorted = process(myArray);

        //output
         System.out.println(Arrays.toString(sorted));



      }
      private static int findMax( int EndIndex, double[] enterArray) {
         double max = 0;
         int trueIndex = 0; 
         for( int x = 0; x < EndIndex; x++) {
               if(enterArray[x] > max) {
                  max = enterArray[x];
                  trueIndex = x;
               }
               }

      return trueIndex;
      }
      private static void swap(int swap1, int swap2, double[] enterArray) {
         double temp = 0;
         temp = enterArray[swap1];
         enterArray[swap1] = enterArray[swap2];
         enterArray[swap2] = temp;

      }
      private static double[] process(double[] enterArray) {
         int range = enterArray.length -1;
         for( int x = 0; x < enterArray.length; x++) {
            int j = findMax(range, enterArray);
            swap(j, range, enterArray);
            range = range -1;
         }
         return enterArray;
      }
      }

1 Ответ

0 голосов
/ 08 мая 2018

При звонке:

int j = findMax(range, enterArray);

в процессе (), диапазон определяется как

int range = enterArray.length-1

То есть ваша функция findMax () не проходит весь массив

Вы можете исправить это, изменив цикл for в функции findMax () на:

    for (int x = 0; x < EndIndex+1; x++) {
      ...
    }

Возможно, есть более элегантное решение, но это проблема в вашем коде

EDIT:

Лучшим решением было бы изменить функцию process () на:

private static double[] process(double[] enterArray) {
    int range = enterArray.length;
    System.out.println("Array Length: " + enterArray.length);
    for (int x = 0; x < enterArray.length; x++) {
        int j = findMax(range, enterArray);
        swap(j, range-1, enterArray);
        range--;
    }
    return enterArray;
}

Таким образом, findMax () может циклически перемещаться по всему диапазону массива, а swap - к последнему элементу массива. диапазон уменьшается, поскольку максимальное число теперь является последним элементом массива. Это легче понять с внешней точки зрения, чем мой первоначальный ответ.

...