直线选择排序中的比较次数

时间:2014-01-10 12:26:45

标签: algorithm sorting

我在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。

我也用谷歌搜索直接选择排序,但我只得到选择排序的结果。 我还找到了术语交换选择排序。 到目前为止,我只听说过选择排序,所以请对交换和直选选择排序之间的区别给出一些看法。

提前致谢。

3 个答案:

答案 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)

用可视化来澄清

Click Here

您可以简单地放置一个计数器来跟踪编号。比较和没有。在选择排序内交换。 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 给出否。选择排序的比较