【问题标题】:Improvement for Selection Sort Algorithm?选择排序算法的改进?
【发布时间】:2018-06-12 07:34:05
【问题描述】:

我是 CS 的新学生。现在我正在自学编程入门。我正在研究选择排序算法,我认为通过在下面对选择排序进行这种更改,它会提高效率,这是真的还是我遗漏了什么? 改变不是每次都调用swap函数,即使数组没有变化,我们可以添加changeMade布尔变量,我们只在数组发生变化时使用它来调用函数。如有错误请指正

Declare Integer startScan, i, minValue
Declare Integer minIndex


//the boolean variable
//that could make algorithim
//more efficient 
Declare Boolean changemade

//Declare the array and Declare it is size
//and initialize it
Constant Integer SIZE = 5
Declare Integer array[SIZE]=1, 4, 8, 2, 5

For StartScan = 0 To SIZE-2
    set changeMade = False
    set array[startScan]= minValue
    For i= startScan+1 To SIZE-1
        If array[i]<minValue Then
            set minValue=array[i]
            set minIndex= i
            set changeMade=True //the modification 
        End If
    End For  
    If ChangeMade = True Then
    call swap(array[minIndex], array[startScan])
End For

Module swap(Integer Ref a, Integer Ref b)
    Declare Integer temp
    set temp = a
    set a = b
    set b = temp
End Module 

【问题讨论】:

  • 如果你查看算法的实现,其实已经是这样了。这个想法是:遍历每个元素,从当前索引开始从列表中选择最小元素,如果它不是当前元素,则将其与当前元素交换。您的ChangeMade 变量只是检查最小索引是否与当前索引相同的实现。
  • 您的更改可能更有效率,但可能会更昂贵。如果在一次迭代中进行了许多更改,您最终不得不多次设置ChangeMade 标志。也许更好的优化是将changeMade 检查替换为If minIndex &lt;&gt; startScan。你不需要changeMade 标志。

标签: algorithm computer-science selection-sort


【解决方案1】:

计算复杂度时几乎忽略掉swap等操作。

虽然在计算时间复杂度时考虑了所有操作。但是由于与其他操作相比,循环占主导地位,我们忽略了其他操作,只考虑占主导地位的操作(因为输入值大,所有其他操作的成本都远小于占主导地位的操作)。

作为选择排序的示例:当您考虑所有语句成本时,您会得到一个函数 f(n)=an2+bn+c(a、b 和 c 是常数,取决于机器架构)。这里主导项是an2。所以我们可以说选择排序的时间复杂度O(an2)。我们也忽略了主导项系数a,因为a不会改变增长率。​​p>

您是否阅读过有关渐近分析和符号(例如 theta、omega、大 O)的内容。看看它们,它将帮助您找到问题的答案。

【讨论】:

  • 感谢您的回答
  • 您假设算法的质量仅通过其渐近复杂度来评估,而建议的启发式算法不会降低该算法的复杂度。无论如何,如果它在实践中加速事情,启发式可能会很好,所以这值得讨论。渐近复杂性不是一切。
【解决方案2】:

这听起来像是一个错误的好主意。

这种启发式对已经在正确位置的元素有效。

假设其中有 10%,可以认为是乐观的。在对 N 个元素进行排序时,您将节省 0.1 N 次交换,但会为标志添加大量分配(最多 N²/2 !)和标志的 N 次测试(条件指令非常慢)。

除非交换成本真的很高,否则操纵标志的开销将占主导地位的可能性很高。


放弃标志并测试minIndex != startScan当然是一个更好的主意,但即便如此,也不确定避免交换是否会抵消额外的比较。

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2019-04-24
    • 1970-01-01
    • 2021-12-29
    • 2019-03-31
    相关资源
    最近更新 更多