我正在尝试创建一个执行选择排序但向后退的程序。如同,找到最大数字并用最后一个交换它。我不知道为什么这不起作用。
根据评论更新的代码。
import java.util.Scanner;
public class Problem20 {
public static void main(String[] args){
int data[] = new int[10];
Scanner scan = new Scanner(System.in);
System.out.print("Please enter 10 numbers: ");
for (int i = 0; i < 10; i++)
{
data[i] = scan.nextInt();
}
sortBig(data);
}
public static void sortBig(int[] data){
int i, j, maxIndex, tmp;
for (i = data.length - 1; i >= 0; i--)
{
maxIndex = i;
for (j = i-1; j >=0; j--)
if (data[j] > data[maxIndex])
maxIndex = j;
if (maxIndex != i)
{
tmp = data[data.length - 1];
data[data.length - 1] = data[maxIndex];
data[maxIndex] = tmp;
}
}
for (int r = 0; r < data.length; r++){
System.out.print(data[r] + " ");
}
}
}
答案 0 :(得分:0)
您需要撤消第一个for循环 - for(int i = data.length - 1; i >= 0; i--)
您还需要修改第二个for循环以反映第一个for循环中的更改(循环内部看起来很好,但循环初始化块需要更正)
答案 1 :(得分:0)
这是我编写的一个简单测试,可以轻松调试代码。
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class Problem20 {
@Test
public void testSorting() {
// passes
assertTrue(Arrays.equals(new int[]{1, 2, 3}, sortBig(3, 2, 1)));
// failed previously
assertTrue(Arrays.equals(new int[]{1, 2, 3, 4}, sortBig(4, 3, 2, 1)));
// create an array of unique values in pseudo random order
int[] largeArray = new int[1000];
for (int i = 0; i < largeArray.length; i++)
largeArray[i] = (i * 29) % largeArray.length;
int[] sortedArray = sortBig(largeArray);
for (int i = 0; i < largeArray.length; i++)
assertEquals(i, sortedArray[i]);
}
public static int[] sortBig(int... data) {
for (int i = data.length - 1; i >= 0; i--) {
int maxIndex = i;
for (int j = i - 1; j >= 0; j--)
if (data[j] > data[maxIndex])
maxIndex = j;
if (maxIndex != i) {
// int tmp = data[data.length - 1];
int tmp = data[i];
// data[data.length - 1] = data[maxIndex];
data[i] = data[maxIndex];
data[maxIndex] = tmp;
}
}
return data;
}
}
我发现无法排序的最简单的列表是4,3,2,1并且通过调试它我可以看到你总是与最后一个元素交换,而不是被搜索的最后一个元素data.length -1
{{1在进行了这种替换后,测试甚至可以用于大型数组。