这是我的计划的一部分:
private static int[] array = {5, 2, 3, 1, 4, 7, 8, 6, 10, 9};
private static void selectionSort(int arr[])
{
for (int i = 0; i < arr.length - 1; i++)
{
int index = i;
for (int j = i + 1; j < arr.length; j++)
{
if (arr[j] < arr[index])
{
index = j;
}
int smallerNumber = arr[index];
arr[index] = arr[i];
arr[i] = smallerNumber;
}
}
for (int i = 0; i < arr.length; i++)
{
System.out.print(arr[i]);
}
}
我试图按顺序对所有数字进行排序。它正在打印以下内容:
1 3 2 5 4 6 7 8 9 10
我不明白为什么有些数字是有序的,有些则不是。有人可以帮忙吗?
答案 0 :(得分:1)
您应该将arr[j]
与arr[index]
(而不是arr[i]
)进行比较,并且在内部循环完成之前,您不应该交换这些元素。您可以使用Arrays.toString(int[])
打印阵列。像,
private static void selectionSort(int arr[]) {
for (int i = 0; i < arr.length - 1; i++) {
int index = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[index]) {
index = j;
}
}
if (index != i) {
int smallerNumber = arr[index];
arr[index] = arr[i];
arr[i] = smallerNumber;
}
}
}
public static void main(String[] args) {
int[] array = { 5, 2, 3, 1, 4, 7, 8, 6, 10, 9 };
selectionSort(array);
System.out.println(Arrays.toString(array));
}
输出(正如预期的那样)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
答案 1 :(得分:0)
认为这很糟糕
if (arr[j] < arr[index])
应该是
if (arr[j] < arr[i])
因为你总是将最小的一个移动到i的当前位置。
或者如果你想进行优化,最后像Elliot建议的那样进行交换。
不工作,你不能每次都交换,只要数量较小,所以在if里面移动交换。你也可以摆脱索引,除非你只想在最后交换,否则它是没用的。
if (arr[j] < arr[i])
{
int smallerNumber = arr[j];
arr[j] = arr[i];
arr[i] = smallerNumber;
}