假设我们使用一些二次排序算法对十个整数的数组进行排序。在算法的主循环的四次迭代之后,数组元素按如下所示排序:
1 2 3 4 5 0 6 7 8 9
哪个陈述正确? (注意:我们的选择排序首先选择最大的项目。)
的 A 即可。算法可以是选择排序或插入排序。
的乙即可。该算法可能是selectionsort,但不能是insertionsort。
C 即可。该算法可能是insertionsort,但不能是selectionsort。
的 d 即可。该算法既不是选择也不是插入。
我认为答案应该是A(插入排序和选择排序)?但我在一些网站上发现正确答案是C.我不知道原因。有人可以解释一下。
如果我错了,请纠正我。
来源:Google Book
答案 0 :(得分:0)
插入排序是可能的,因为当前快照刚刚完成从索引0到4的数组排序。
选择排序将首先选择最小值(在您的示例中为0)并将其放在左端。所以答案是 C 。
答案 1 :(得分:0)
此输出可用于最大的第一选择排序。
它不能是最小的第一选择排序,因为选择排序保持不变量,在n次迭代之后,列表中的前n个项目是完全排序的。因此,如果这是一个选择排序,您可能希望在第一次迭代中将值为0的元素排序为索引0。因此,在前4次迭代之后,列表看起来像0 1 2 3 ...
。
对于最大第一个和最小第一个插入排序,输出都是可能的,因为插入排序具有不同的不变量。在插入排序中,在n次迭代之后,列表中的前n个项(最大的第一个排序的最后n个)相对于彼此进行排序,但它们不一定在列表中的最终位置。
对于最小的第一次插入排序,经过4次迭代后,可以看到"不合适的位置" 0因为排序还没有足够重复以将0重新定位在正确的索引中。
答案 2 :(得分:0)
这可以是最大优先选择排序或插入排序的输出。如果数组最初看起来像这样,在任一算法的4次迭代之后,它仍然看起来像那样。它不能是最小的第一选择排序,因为经过4次迭代后,数组的前4项将是0 1 2 3
。
答案 3 :(得分:0)
根据我的回答是 C。 *
Selection sort-
for(int x=0; x<n; x++){
int index_of_min = x;
for(int y=x; y<n; y++){
if(array[index_of_min]>array[y]){
index_of_min = y;
}
}
int temp = array[x];
array[x] = array[index_of_min];
array[index_of_min] = temp;
}
*
之所以如此,是因为在Selection sort中你遍历数组中x的右边数组并在每次传递中找到最小元素并用[x]替换该索引。 在上述情况
1 2 3 4 5 0 6 7 8 9
min元素为0,如果使用选择排序,它应该是最左边的元素,因为整个数组中第一遍最小值的选择排序应该是[0]。 插入排序是可能的,因为在插入排序中我们拾取元素并继续比较当前元素与其左边的元素,直到当前元素处于其正确的排序位置。我想说的是: *
> Here is an example: for sorting the array the array 52314 First, 2 is
> inserted before 5, resulting in 25314 Then, 3 is inserted between 2
> and 5, resulting in 23514 Next, one is inserted at the start, 12354
> Finally, 4 is inserted between 3 and 5, 12345.
* 所以插入排序是可能的,因为它已完成排序到第四遍。