为什么我的选择排序排序数组?

时间:2016-04-21 00:29:13

标签: java sorting

这是我的计划的一部分:

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 

我不明白为什么有些数字是有序的,有些则不是。有人可以帮忙吗?

2 个答案:

答案 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;
    }