0

下面通过代码片段中的注释标记的语句实现选择排序的作用是什么?

int temp, min;

for (i = 0; i <= count - 2; i++) {
    min = i;
    for (int j = i + 1;  j <= count - 1; j++) {
        if (arr[min] > arr[j]) {
            if (arr[i] == arr[min]) {    //What's the significance of this statement?
                temp = arr[min];
                arr[min] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

那句话的意义何在?是否会有一个输入,这个 if 条件实际上很重要?

4

3 回答 3

3

正如您在外部循环中定义的 min = i 一样,条件总是得到满足,因此,您可以通过删除条件来优化代码。

在选择排序中,您还可以进行更多优化。您可以找到真正的最小值的位置,例如 a[pos],然后将其与 a[i] 交换,而不是每次找到新的最小值时交换值。

于 2012-07-21T21:56:46.303 回答
2

您已min = i;在 j 循环之前定义,并且循环内 i 和 min 的值没有发生变化,因此,无论如何,arr[min] 将始终等于 arr[i],评估 if 条件总是如此,所以这些线条没有任何作用。删除条件,你的代码会变得更快(如果编译器没有优化代码)。

于 2012-07-21T14:27:15.407 回答
0
  • 变量 i 从 0 变为 count-1

  • 在 i 的每个循环中,您希望从 i 到 count-1 的最小值位于 arr[i] 位置。要获得 a[i] 的最小值,您可以这样做:

  • 将 min 设置为位置 i

  • 循环变量 j 从 i+1 到 count-1

  • 如果 a[j] 小于 a[min],则要扫描 a[min] 和 a[j]。

这样做,在每个循环 j 结束时,您将在 a[i] 上有一个最小值。

于 2012-07-21T22:14:33.487 回答