Swift 程序使用快速排序对数组进行升序排序
Swift 中的快速排序算法是一种基于分治法的排序算法。在这种排序中,我们首先通过选择一个枢轴元素将数组划分为子数组。划分的方式是,最小元素放在枢轴元素的左侧,最大元素放在枢轴元素的右侧。现在,左右子数组也使用相同的方法进行划分。此过程持续到所有子数组都包含一个元素。此时,数组元素已排序完毕,我们将它们合并为一个数组以在输出中显示。现在我们使用快速排序按升序对数组进行排序。
算法
步骤 1 − 创建一个函数,使用快速排序按升序对数组进行排序。
步骤 2 − 在函数内部,我们首先检查数组的长度。如果它有 0 或 1 个元素,则返回已排序的数组。
步骤 3 - 从给定数组的中间选择枢轴元素。
步骤 4 - 过滤小于枢轴元素的元素
步骤 5 - 过滤等于枢轴元素的元素
步骤 6 - 过滤大于枢轴元素的元素
步骤 7 - 现在递归地对子数组进行排序,并使用 + 运算符将它们连接成单个数组。
步骤 8 - 调用函数并将数组传递给它。
步骤 9 - 打印排序后的结果数组。
示例
在下面的示例中,我们将创建一个名为 quickSortAlgo() 的函数。该函数以一个数组作为输入,并借助快速排序将给定数组按升序排序。然后,我们首先从数组中选择中间元素作为枢轴元素。然后将数组分成三个包含元素的子数组:小于枢轴元素、大于枢轴元素和等于枢轴元素。现在,我们递归地对 lessEle 和 greaterEle 应用快速排序,然后使用 + 运算符连接所有已排序的子数组,最后按降序显示排序后的数组。
import Foundation
import Glibc
// 使用快速排序对数组进行升序排序的函数
func quickSortAlgo(arr: [Int]) -> [Int] {
// 如果数组包含 0 或 1 个元素,则表示数组已排序
guard arr.count > 1 else { return arr }
// 选择中间的枢轴元素
let pivotEle = arr[arr.count/2]
// 过滤小于枢轴元素的元素
let lessEle = arr.filter { $0 < pivotEle }
// 过滤等于枢轴元素的元素
let equalEle = arr.filter { $0 == pivotEle }
// 过滤大于枢轴元素的元素
let greaterEle = arr.filter { $0 > pivotEle }
// 现在递归地对子数组进行排序,并将它们连接成单个数组
return quickSortAlgo(arr: lessEle) + equalEle + quickSortAlgo(arr: greaterEle)
}
let arr = [3, 6, 1, 8, 1, 56, 23, 12, 5]
let resultantArr = quickSortAlgo(arr: arr)
print("已排序数组:", resultantArr)
输出
已排序数组:[1, 1, 3, 5, 6, 8, 12, 23, 56]
结论
以上就是如何使用快速排序对数组进行升序排序的方法。这里我们使用 filter(_:) 方法实现快速排序,但您也可以使用其他方法。快速排序由于其分治法,可以轻松解决问题,但它的最坏情况时间复杂度为 O(n²)。它适用于大数据集,但对于小数据集则不是最佳选择。