Было бы лучше, если вы начнете с Java-алгоритма и просто конвертируете его в Swift https://www.baeldung.com/java-quicksort
Версия Swift должна выглядеть примерно такнапример:
func quickSort(_ arr: inout [Int], begin: Int, end: Int) {
if begin < end {
let partitionIndex = partition(&arr, begin: begin, end: end)
quickSort(&arr, begin: begin, end: partitionIndex - 1)
quickSort(&arr, begin: partitionIndex + 1, end: end)
}
}
func partition(_ arr: inout [Int], begin: Int, end: Int) -> Int {
let pivot = arr[end]
var i = begin - 1
for j in begin..<end {
if arr[j] <= pivot {
i += 1
arr.swapAt(i, j)
}
}
arr.swapAt(i + 1, end)
return i + 1
}
Если вы хотите сделать quickSort изменяемым универсальным методом в коллекции для использования с любым сопоставимым элементом:
extension MutableCollection where Self: RandomAccessCollection, Element: Comparable, Index == Int {
mutating func quickSort(begin: Int, end: Int) {
if begin < end {
let partitionIndex = partition(begin: begin, end: end)
quickSort(begin: begin, end: partitionIndex - 1)
quickSort(begin: partitionIndex + 1, end: end)
}
}
mutating func partition(begin: Int, end: Int) -> Int {
let pivot = self[end]
var i = begin - 1
for j in begin..<end where self[j] <= pivot {
i += 1
swapAt(i, j)
}
swapAt(i + 1, end)
return i + 1
}
}
Тестирование игровой площадки:
var array = [1,3,2,5,4,7,6]
array.quickSort(begin: 0, end: 6)
array // [1, 2, 3, 4, 5, 6, 7]