我一直在使用排序算法,我發現快速排序無法正確使用交換功能沒有臨時變量。我附上了下面的代碼。你可以在swift操場上執行這個代碼,它的編寫速度很快。 This is the link to execute this code online. 請讓我知道你需要的任何其他信息來解決這個問題。如果有人能解釋這一點,我會很感激。快速排序無法正常工作與交換功能沒有臨時變量
注 - 我已經在交換功能中評論了兩個有點代碼。一個沒有臨時變量,另一個是臨時變量。這段代碼完全適用於具有臨時變量的交換函數。
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)
我的猜測是,有時a和b指向相同的元素。使用「智能」算法是許多程序員的陷阱。使用臨時變量或甚至swift本地交換功能會更好。魔術交換有很多問題。浮點值會更危險。 – Sulthan
@Sulthan我不認爲它的東西是隨機的,因爲在每次運行中輸出都是一樣的。我相信這與循環和交換功能有些相關。沒有? – va05