返回
用 Swift 算法学院找到数组中第 k 大值
IOS
2024-01-04 23:24:07
引言
在数据科学和计算机科学中,查找数组中第 k 大值的算法非常有用。此任务的应用包括快速选择和排序算法。在本文中,我们将使用来自 Swift 算法学院的 Swift 实现,一步步地解决这个问题。
算法概述
Swift 算法学院的算法采用分治策略,将数组划分为较小的部分,并递归地查找每个部分的第 k 大值。具体步骤如下:
- 选择基准点: 从数组中随机选择一个元素作为基准点。
- 分区: 将数组划分为两部分:比基准点小的元素和比基准点大的元素。
- 递归: 如果 k 等于分区后较小部分的长度,则基准点就是第 k 大值。否则,在较小部分或较大部分继续递归地查找第 k 大值。
Swift 实现
func findKthLargest(_ nums: [Int], _ k: Int) -> Int {
guard nums.count >= k, k > 0 else {
fatalError("Invalid input")
}
return quickSelect(nums, 0, nums.count - 1, k - 1)
}
func quickSelect(_ nums: [Int], _ start: Int, _ end: Int, _ k: Int) -> Int {
guard start <= end else {
fatalError("Invalid range")
}
let pivot = partition(nums, start, end)
if k == pivot {
return nums[pivot]
} else if k < pivot {
return quickSelect(nums, start, pivot - 1, k)
} else {
return quickSelect(nums, pivot + 1, end, k)
}
}
func partition(_ nums: [Int], _ start: Int, _ end: Int) -> Int {
let pivot = nums[end]
var partitionIndex = start
for i in start..<end {
if nums[i] < pivot {
nums.swapAt(i, partitionIndex)
partitionIndex += 1
}
}
nums.swapAt(partitionIndex, end)
return partitionIndex
}
示例用法
let nums = [3, 2, 1, 5, 6, 4]
let k = 2
let result = findKthLargest(nums, k)
print("The \(k)th largest element is: \(result)") // 输出:5
SEO 优化