我一直在使用排序算法,我发现快速排序在没有临时变量的交换功能下无法正常工作。我已附上以下代码。您可以在swift playground中执行此代码,它以swift编写。 Table 请告诉我您需要的任何其他信息。如果有人能解释一下,我真的很感激。
注意 - 我在交换函数中评论了两个有点代码。一个没有临时变量,另一个是临时变量。此代码与带有临时变量的交换函数完美配合。
func swap(_ a:inout Int , _ b:inout Int)
{
a = a+b
b = a-b
a = a-b
/*
let x = a
a = b
b = x
*/
}
func partition(_ arr : inout [Int], _ low : Int, _ high : Int )->Int
{
let pivot = arr[high]
var i = low-1
var j = low
while(j<high)
{
if(arr[j]<=pivot)
{
i=i+1
swap(&arr[i],&arr[j])
}
j = j+1
}
swap(&arr[i+1],&arr[high])
return i+1
}
func quickSort(_ arr : inout [Int], _ low : Int, _ high : Int )
{
if low < high
{
let pi = partition(&arr,low,high)
quickSort(&arr,low,pi-1)
quickSort(&arr,pi+1,high)
}
}
var arr = [11 , 40 ,50 ,20 ,30,77,90,77,14,8,897,765,34,0,89]
print(arr)
quickSort(&arr,0,arr.count-1)
print(arr)
答案 0 :(得分:3)
如果两者兼而有之,那么“无临时变量的交换”不起作用 arguments指向同一个数组元素:
func swap(_ a:inout Int , _ b:inout Int) {
a = a+b
b = a-b
a = a-b
}
var a = [5, 6, 7]
swap(&a[0], &a[0])
print(a) // [0, 6, 7]
请注意,即使传递相同数组的两个不同元素 因为函数的inout参数是未定义的行为。 在Swift 4 / Xcode 9中,您将收到编译器警告:
var a = [5, 6, 7]
swap(&a[0], &a[1])
// warning: overlapping accesses to 'a', but modification requires exclusive access; consider copying to a local variable
和运行时错误:
同时访问0x1005e4f00,但修改需要独占访问。
这就是swapAt()
方法(将两个 indices 作为参数)的原因
已添加到Swift 4中的MutableCollection
。
有关详细信息,请参阅SE-0176 Enforce Exclusive Access to Memory。
答案 1 :(得分:1)
当a
和b
指向同一元素时,您的交换函数将会中断。首选具有临时变量的版本,该变量更易读,并且对每种数据类型和每个值都能正常工作。
请注意,当添加两个高值时,该函数也会溢出,并且它可能会完全破坏浮点值。