我是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
答案 0 :(得分:2)
在计算复杂性时几乎忽略了交换等操作。
虽然在计算时间复杂度时会考虑所有操作。但由于循环与其他操作相比占主导地位,我们忽略其他操作并且只考虑主导操作(因为对于大输入值,所有其他操作的成本远小于主导操作)。
作为选择排序的示例:当您考虑所有语句成本时,您将获得函数f(n)= an2 + bn + c(a,b和c是常量并且取决于机器体系结构)。这里的主导词是an2。所以我们可以说选择时间复杂度排序为O(an2)。我们也忽略了主导词系数a,因为它不会改变增长率。 p>
您是否阅读过渐近分析和符号,如theta,omega,big O.看看它们,它将帮助您获得问题的答案。
答案 1 :(得分:0)
这听起来像个错误的好主意。
这种启发式方法对已经处于正确位置的元素有效。
假设有10%,可以认为是乐观的。在对N个元素进行排序时,您将节省0.1 N个交换,但会为该标志添加大量赋值(最多为N 2/2!)和标志的N次测试(条件指令非常慢)。
除非交换真的很昂贵,否则操纵旗帜的开销将占主导地位的可能性很高。
放弃标志并测试minIndex != startScan
当然是一个更好的主意,但即使这样,也不确定避免交换会抵消额外的比较。