选择排序算法的改进?

时间:2018-06-12 07:34:06

标签: algorithm computer-science selection-sort

我是CS的新生。现在我正在自学编程介绍。我正在研究选择排序算法,我认为通过将此更改改为选择排序,它会使它更有效率,这是真的还是我错过了什么? 更改不是每次调用交换函数,即使没有对数组进行更改,我们也可以添加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 

2 个答案:

答案 0 :(得分:2)

在计算复杂性时几乎忽略了交换等操作。

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

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

您是否阅读过渐近分析和符号,如theta,omega,big O.看看它们,它将帮助您获得问题的答案。

答案 1 :(得分:0)

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

这种启发式方法对已经处于正确位置的元素有效。

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

除非交换真的很昂贵,否则操纵旗帜的开销将占主导地位的可能性很高。

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