Algorithm 选择排序算法的改进?

Algorithm 选择排序算法的改进?,algorithm,computer-science,selection-sort,Algorithm,Computer Science,Selection Sort,我是CS的新生。现在我正在自学编程入门。我在研究选择排序算法,我认为通过在下面对选择排序进行更改,它将使它更加有效,这是真的还是我遗漏了什么?? 更改不是每次调用swap函数,即使数组没有更改,我们也可以添加changemake布尔变量,并且仅当数组发生更改时才使用它调用函数。如果我错了,请纠正我 Declare Integer startScan, i, minValue Declare Integer minIndex //the boolean variable //that coul

我是CS的新生。现在我正在自学编程入门。我在研究选择排序算法,我认为通过在下面对选择排序进行更改,它将使它更加有效,这是真的还是我遗漏了什么?? 更改不是每次调用swap函数,即使数组没有更改,我们也可以添加changemake布尔变量,并且仅当数组发生更改时才使用它调用函数。如果我错了,请纠正我

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 
声明整数startScan,i,minValue
声明整数minIndex
//布尔变量
//那可能会让他变得更聪明
//更有效率
声明布尔更改已完成
//声明数组并声明其大小
//并初始化它
常量整数大小=5
声明整数数组[SIZE]=1,4,8,2,5
对于StartScan=0至尺寸2
设置changemake=False
设置数组[startScan]=minValue
对于i=startScan+1至尺寸-1

在计算复杂度时,几乎忽略了If数组[i]操作,如swap

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

作为选择排序的一个例子:当考虑所有的语句代价时,得到函数f(n)=AN2+BN+C(A、B和C是常数,并依赖于机器体系结构)。这里的主导项是an2。所以我们可以说选择排序的时间复杂性为O(an2)。我们也忽略了主导项系数a,因为a不会改变增长率


你有没有读过渐近分析和符号,比如θ,ω,大O。看看它们,它会帮助你得到问题的答案

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

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

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

除非互换成本很高,否则操纵旗帜的开销占主导地位的可能性很高



放下标志并测试
minIndex!=startScan
,但即便如此,也不确定避免交换是否会抵消额外的比较。

如果查看算法的实现,实际上已经是这样了。其思想是:遍历每个元素,从列表中从当前索引开始选择最小元素,如果它不是当前元素,则将其与当前元素交换。您的
changemake
变量只是检查最小索引是否与当前索引相同的实现。您的更改可能更有效,但可能更昂贵。如果在一次迭代中进行了许多更改,那么最终必须多次设置
changemake
标志。如果minIndex startScan
,也许更好的优化方法是用
替换
ChangeMaked
检查。您不需要
changemake
标志。感谢您的回答,您假设算法的质量仅由其渐进复杂性来评估,而建议的启发式算法不会降低渐进复杂性。无论如何,如果启发式方法在实践中加快了速度,那么它可能是好的,因此这值得讨论。渐进复杂性不是一切。