选择排序方法不起作用?
Selection Sort Method not Working?
最近我写了一个java程序,对一个数组执行选择排序,但是,它似乎return没有正确的输出。我做错了什么?
想要的输出:[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方法查找数组中最大对象的index,方法process利用findMax方法查找最大数的index并与倒数第二个交换,倒数第三个,依此类推,以便按顺序排列数组。
我的代码:
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;
}
}
当你打电话时:
int j = findMax(range, enterArray);
在process()中,范围定义为
int range = enterArray.length-1
因此您的 findMax() 函数不会遍历整个数组
您可以通过将 findMax() 函数中的 for 循环更改为:
来解决此问题
for (int x = 0; x < EndIndex+1; x++) {
...
}
可能有更优雅的解决方案,但这是您代码中的问题
编辑:
更好的解决方案是将您的 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 能够访问数组的最后一个元素。范围递减,因为最大数字现在是数组的最后一个元素。这比我原来的回答更容易从局外人的角度理解。
最近我写了一个java程序,对一个数组执行选择排序,但是,它似乎return没有正确的输出。我做错了什么?
想要的输出:[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方法查找数组中最大对象的index,方法process利用findMax方法查找最大数的index并与倒数第二个交换,倒数第三个,依此类推,以便按顺序排列数组。
我的代码:
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;
}
}
当你打电话时:
int j = findMax(range, enterArray);
在process()中,范围定义为
int range = enterArray.length-1
因此您的 findMax() 函数不会遍历整个数组
您可以通过将 findMax() 函数中的 for 循环更改为:
来解决此问题 for (int x = 0; x < EndIndex+1; x++) {
...
}
可能有更优雅的解决方案,但这是您代码中的问题
编辑:
更好的解决方案是将您的 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 能够访问数组的最后一个元素。范围递减,因为最大数字现在是数组的最后一个元素。这比我原来的回答更容易从局外人的角度理解。