Swift 语言 冒泡排序算法的实现与优化

Swift阿木 发布于 15 天前 4 次阅读


Swift 语言中的冒泡排序算法实现与优化

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序的基本实现

在Swift中实现冒泡排序算法非常简单,以下是一个基本的冒泡排序实现:

swift
func bubbleSort(_ array: [Int]) -> [Int] {
var sortedArray = array
let n = sortedArray.count
for i in 0..<#n {
for j in 0.. sortedArray[j + 1] {
sortedArray.swapAt(j, j + 1)
}
}
}
return sortedArray
}

// 使用示例
let unsortedArray = [64, 34, 25, 12, 22, 11, 90]
let sortedArray = bubbleSort(unsortedArray)
print(sortedArray)

这段代码定义了一个名为`bubbleSort`的函数,它接受一个整数数组作为参数,并返回一个排序后的数组。函数内部,我们使用嵌套循环来比较相邻的元素,并在必要时交换它们的位置。

冒泡排序的优化

尽管冒泡排序是最简单的排序算法之一,但它的效率并不高,其平均和最坏情况的时间复杂度都是O(n^2)。以下是一些优化冒泡排序的方法:

1. 提前终止排序

在冒泡排序中,如果在一轮遍历中没有发生任何交换,那么说明数组已经排序完成。我们可以利用这个特性来提前终止排序。

swift
func optimizedBubbleSort(_ array: [Int]) -> [Int] {
var sortedArray = array
let n = sortedArray.count
for i in 0..<#n {
var swapped = false
for j in 0.. sortedArray[j + 1] {
sortedArray.swapAt(j, j + 1)
swapped = true
}
}
// 如果没有发生交换,则数组已经排序完成
if !swapped {
break
}
}
return sortedArray
}

2. 使用标志位优化

与提前终止排序类似,我们可以使用一个标志位来记录每一轮遍历中是否发生了交换。如果在某一轮遍历中没有发生交换,我们可以认为数组已经排序完成。

swift
func flagBasedBubbleSort(_ array: [Int]) -> [Int] {
var sortedArray = array
let n = sortedArray.count
for i in 0..<#n {
var swapped = false
for j in 0.. sortedArray[j + 1] {
sortedArray.swapAt(j, j + 1)
swapped = true
}
}
// 如果没有发生交换,则数组已经排序完成
if !swapped {
break
}
}
return sortedArray
}

3. 使用双向冒泡排序

双向冒泡排序(也称为鸡尾酒排序)结合了正向和反向冒泡排序的优点。它首先正向冒泡,然后反向冒泡,这样可以在每一轮遍历中处理更多的元素。

swift
func cocktailSort(_ array: [Int]) -> [Int] {
var sortedArray = array
var start = 0
var end = sortedArray.count - 1
while start sortedArray[i + 1] {
sortedArray.swapAt(i, i + 1)
newEnd = i
}
}
end = newEnd
for i in (start...end).reversed() {
if sortedArray[i] < sortedArray[i - 1] {
sortedArray.swapAt(i, i - 1)
newStart = i
}
}
start = newStart
}
return sortedArray
}

总结

冒泡排序是一种简单但效率较低的排序算法。通过优化,我们可以提高其性能。在Swift中,我们可以通过提前终止排序、使用标志位优化以及使用双向冒泡排序等方法来优化冒泡排序算法。尽管如此,冒泡排序通常不适用于大数据集,因为它的时间复杂度较高。对于大数据集,更高效的排序算法,如快速排序、归并排序或堆排序,可能是更好的选择。