我正在参加决赛,我很难理解下面代码的每一行。我理解每种方法在理论上是如何工作的,但是,我在理解代码如何完成手头任务时遇到了问题。我还没有找到一个明确的解释,我已经看了。有人可以通过以下每个功能来评论每个位扮演的角色吗?如果我需要包含完整的程序,请告知我们。由于篇幅过长,我省略了它们。提前谢谢!
void SelectionSort(int numbers[], int array_size) {
for (int i = array_size - 1; i > 0; i--) {
int startIndex = 0; //initialization of start index
for (int j = 1; j <= i; j++) //i don't understand this line or the next two
if (numbers[j] > numbers[startIndex])
startIndex = j;
int tempIndex = numbers[startIndex]; // these three lines use a temp variable to swap
numbers[startIndex] = numbers[i];
numbers[i] = tempIndex;
}
return;
}
void BubbleSort(int numbers[], int array_size) {
for (int outer = (array_size - 1); outer >= 0; outer--) // this line I vaguely understand (need clarification)
for (int inner = 0; inner < outer; inner++) /* this line I vaguely understand (need clarification)*/
if (numbers[inner] < numbers[inner + 1]) /*this compares the two values*/ {
int tempIndex = numbers[inner]; /* these three lines use a temp variable to swap the value in each location if the above criteria is met*/
numbers[inner] = numbers[inner + 1];
numbers[inner + 1] = tempIndex;
}
return;
}
答案 0 :(得分:3)
选择排序:
选择排序在外部循环中以数组中的最后一个值开始。然后它使用内部循环遍历整个数组并找到最大值,将其索引分配给startIndex变量。然后它使用此startIndex值替换最后一个值index i,该值是数组中最大的值。然后,它为数组中的所有值重复此过程。注意,在内部循环中,j&lt; = i使其比j&lt; = array_size-1稍微更有效。这是因为,一旦在外部循环的第一次迭代期间将最后一个索引指定为最大变量,就不需要对其进行任何测试,因为剩下的一切都将小于它。随着我变得越来越小,它上面的所有索引都已经按升序分配了最大的值。
冒泡排序:
外部for循环获取数组中的最后一个值,然后向下迭代到第一个值。对于外循环的每次迭代,内循环测试每对数字,从第一个和第二个开始,然后一直向上,直到它到达外循环所在的索引,并且索引小于该循环。对于内循环的每次迭代,正在比较该对,如果较小索引处的值较小,则它将使用其上方的一个索引切换(因此它按升序排序)。外部循环实际上是不必要的,它只是使循环更有效。它背后的想法是,一旦内部循环的第一次迭代运行,最后一个值必须是最大值,这应该是它应该是,因此在为每个结果迭代运行排序时可以忽略它。它继续这个过程,直到它到达最后一对并相应地对它们进行排序。