没有临时变量的交换功能快速排序无法正常工作

时间:2017-10-13 21:26:58

标签: swift quicksort swap

我一直在使用排序算法,我发现快速排序在没有临时变量的交换功能下无法正常工作。我已附上以下代码。您可以在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)

2 个答案:

答案 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)

ab指向同一元素时,您的交换函数将会中断。首选具有临时变量的版本,该变量更易读,并且对每种数据类型和每个值都能正常工作。

请注意,当添加两个高值时,该函数也会溢出,并且它可能会完全破坏浮点值。