0

我被要求进行选择排序算法,但它不起作用,我不知道为什么。这是代码:

    int count = 0;
    int count2;
    int min;
    int size = scan.nextInt();
    int temp = 0;
    int[] numbers = new int[size];

    while (count < size) {
        numbers[count] = scan.nextInt();
        count ++;
    }
    count = 0;
    while (count < size) {
        count2 = size;
        min = numbers[count];
        while (count < count2) {
            count2 --;
            if (numbers[count2] < numbers[min]) {
                min = count2;
            }
        }
        temp = numbers[temp];
        numbers[temp] = numbers[count];
        numbers[count] = temp;
        count ++;
    }

    count = 0;
    while (count < size) {
        System.out.println(numbers[count]);
        count ++;
    }   
}

输入:10 1 0 2 9 3 8 4 7 5 6

输出:1 2 9 8 3 3 8 4 7 4

4

4 回答 4

1

在 while 循环中,您尝试使用 numbers[0] 元素作为 numbers[] 的索引numbers[min]

min = numbers[count]; \\min is value of first element of numbers[]
    while (count < count2) {
        count2 --;
        if (numbers[count2] < numbers[min]) {  \\ you try to use value of numbers[0] element as index of numbers[] aray.
            min = count2;
        }

用如果替换(numbers[count2] < numbers[min])如果(numbers[count2] < min)

于 2013-09-17T14:10:09.427 回答
0

这是一个有效的算法,它利用了 Java 中 for 的强大功能。要遍历数组或列表,您可以这样做for (int current : array)这比使用 while 或 for 像您所做的那样方便得多。

    int min;
    int mem = 0;
    int size = 11;
    int [] numbers = {10, 1, 0, 2, 9, 3, 8, 4, 7, 5, 6};

    for (int i=0; i<size-1; i++){
        min =i;
        for(int j=i+1; j<size; j++){
            if (numbers[j]<numbers[min]){
                min = j;
            }
        }

        // swap
        mem= numbers[i];
        numbers[i] = numbers[min];
        numbers[min] = mem;

    }

    for (int toPrint : numbers){
        System.out.println(toPrint);
    }

}
于 2013-09-17T14:09:57.380 回答
0
temp = numbers[temp];
numbers[temp] = numbers[count];
numbers[count] = temp;
count ++;

再看看这段代码。

如果您在第一个输入为 11 的地方运行此程序,则会因索引超出范围而出错。

特别是,你打算用什么来完成temp = numbers[temp]?您将 temp 分配给基本上是任意数字,因为numbers[0]可以是任何数字。

于 2013-09-17T14:02:31.940 回答
0

您在输出中获得重复值(不在输入中)的事实意味着您的交换不起作用,因此:

temp = numbers[temp];
numbers[temp] = numbers[count];
numbers[count] = temp;

是错的。

它应该是min,而不是temp

temp = numbers[min];
numbers[min] = numbers[count];
numbers[count] = temp;
于 2013-09-17T14:05:19.670 回答