Java 选择排序方法不起作用?

Java 选择排序方法不起作用?,java,selection-sort,jgrasp,Java,Selection Sort,Jgrasp,最近我编写了一个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.Arr

最近我编写了一个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;
      }
      }
导入java.util.array;
导入java.io.*;
公共类驱动程序01
{
公共静态void main(字符串[]args)
{
//输入
double[]myArray={2.0,3.7,9.9,8.1,8.5,7.4,15.7,6.2};
//对数组进行排序
double[]排序=进程(myArray);
//输出
System.out.println(Arrays.toString(sorted));
}
私有静态int-findMax(int-EndIndex,双[]enterArray){
双最大值=0;
int-trueIndex=0;
对于(int x=0;x最大值){
max=enterArray[x];
真实指数=x;
}
}
回归指数;
}
专用静态无效交换(int-swap1、int-swap2、双[]数组){
双温=0;
temp=输入阵列[swap1];
enterArray[swap1]=enterArray[swap2];
enterArray[swap2]=温度;
}
私有静态双[]进程(双[]enterArray){
int range=enteraray.length-1;
用于(int x=0;x
当您呼叫时:

int j = findMax(range, enterArray);
在process()中,范围定义为

int range = enterArray.length-1
因此,findMax()函数不会遍历整个数组

可以通过将findMax()函数中的for循环更改为:

    for (int x = 0; x < EndIndex+1; x++) {
      ...
    }
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;
}
for(int x=0;x
可能有一个更优雅的解决方案,但这就是代码中的问题

编辑:

更好的解决方案是将process()函数更改为:

    for (int x = 0; x < EndIndex+1; x++) {
      ...
    }
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;
}
私有静态双[]进程(双[]enterArray){
int range=enteraray.length;
System.out.println(“数组长度:“+enterArray.Length”);
用于(int x=0;x
这样,findMax()就可以在整个数组范围内循环,swap就可以访问数组的最后一个元素。由于最大数量现在是数组的最后一个元素,所以范围将减小。从外部的角度来看,这比我最初的答案更容易理解