我在Pearson的书中找到了这个问题。
How many comparisons are needed to sort an array of length 5
(whose element are already in opposite order) using straight selection sort?
a. 5
b. 20
c. 4
d. 10
正确答案是b。 20
但我认为这将是d。 10
请解释答案是20。
我也用谷歌搜索直接选择排序,但我只得到选择排序的结果。 我还找到了术语交换选择排序。 到目前为止,我只听说过选择排序,所以请对交换和直选选择排序之间的区别给出一些看法。
提前致谢。
答案 0 :(得分:3)
10应该是正确答案。
来自Wikipedia:
与其他排序算法相比,选择排序并不难分析,因为没有一个循环依赖于数组中的数据。选择最低元素需要扫描所有
n
元素(这需要进行n − 1
比较),然后将其交换到第一个位置。查找下一个最低元素需要扫描剩余的n − 1
元素,依此类推,以进行(n − 1) + (n − 2) + ... + 2 + 1 = n(n − 1) / 2 ∈ Θ(n^2)
比较。
所以,对于5个元素,它是5*4/2 = 20/2 = 10
(注意“没有一个循环依赖于数组中的数据”,所以它按降序排列的事实不起作用比较次数)。
我所假设的是直接和交换选择排序之间的差异不会影响比较次数。
交换交换(交换)元素和直接移位元素(或使用不需要向上移动的数据结构,例如链表)是有意义的。请注意,我们只进行比较以找到我们想要的元素,没有(元素)比较涉及交换,移位或链表插入。
Wikipedia使用交换作为默认算法,并在“变体”下列出替代方案。
答案 1 :(得分:0)
用可视化来澄清
或
您可以简单地放置一个计数器来跟踪编号。比较和没有。在选择排序内交换。 JavaScript 代码片段如下所示。
var arr = [10, 6, 4, 9, 13];
let size = arr.length;
let swap = 0;
let comp = 0;
for(let i = 0; i < (size-1); i++)
{
var min = i;
for(let j = i+1; j < size; j++ )
{
if(arr[j] < arr[min]){ min = j;}
comp++;
}
[arr[i], arr[min]] = [arr[min], arr[i]];
if(min!=i) { swap++; }
}
console.log("Total Comparison: " + comp);
console.log("Total Swapping: " + swap);
没有。选择排序的比较数 = N*(N-1))/2
答案 2 :(得分:-1)
(n *(n-1))/ 2 给出否。选择排序的比较