通过代码片段中的注释来实现选择排序,下面标记的语句的作用是什么?
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条件实际上是重要的?
答案 0 :(得分:3)
由于您在外部循环中定义了min = i,因此始终满足条件,因此,您可以通过删除条件来优化代码。
在选择排序中,您还可以进行更多优化。每次找到新的最小值时,您都可以找到真正最小值的位置,比如a [pos],然后将其与a [i]交换。而不是交换值。
答案 1 :(得分:2)
你已经在j循环之前定义了min = i;
并且在循环内部没有发生i和min值的变化,所以,无论如何,arr [min]将始终等于arr [i],评估条件是否始终为真,因此这些行没有任何作用。删除条件,您的代码将变得更快(如果编译器没有优化代码)。
答案 2 :(得分:0)
变量i从0变为count-1
在i的每个循环中,你想得到位置arr [i]从i到count-1的最小值。要获得[i]的最小值,请执行以下操作:
将min设置为位置i
循环使用变量j从i + 1到count-1
如果[j]小于[min],你想要扫描[min]和[j]。
这样做,在每个循环j结束时,你将在[i]上有一个最小值。