前言
之前寫(xiě)過(guò)一篇Swift排序之sort函數(shù),里面僅僅寫(xiě)了sort函數(shù)怎么使用丸氛。今天用一些常用的算法,試著實(shí)現(xiàn)一下swift中的sort函數(shù),順便也學(xué)習(xí)一下常用的排序算法。
最近在網(wǎng)上也看了一些swift的排序算法灭将,但是感覺(jué)寫(xiě)的都不太好,都是類(lèi)似于這種
func sort(a:[Int]) {
.......
}
這種其實(shí)也不是不行后控,但是有點(diǎn)不太符合swift的風(fēng)格庙曙,我們看swift中的sort是沒(méi)有把數(shù)組傳過(guò)去的,他只是Array的一個(gè)擴(kuò)展浩淘。應(yīng)該是這么用的
let a = ["2","1","3"]
a.sort(<)
下面我們拋開(kāi)正序還是倒敘捌朴,默認(rèn)為正序排,來(lái)探討下swift中基于Array的擴(kuò)展的冒泡排序馋袜,選擇排序和快速排序
1. 冒泡排序
冒泡排序再基礎(chǔ)不過(guò)了,這里就不再講其原理了舶斧,實(shí)在不會(huì)可以看下百度百科冒泡排序
既然冒泡排序避免不了數(shù)組中兩個(gè)數(shù)據(jù)交換欣鳖,先寫(xiě)一個(gè)交換函數(shù)
// 交換數(shù)組中i和j兩個(gè)位置的數(shù)據(jù)
extension Array {
fileprivate mutating func swap(i:Int,j:Int) {
(self[i],self[j]) = (self[j],self[i])
}
}
下面就是排序了也很簡(jiǎn)單就不多解釋了
// MARK: - 冒泡排序
/**
* 通過(guò)與相鄰元素的比較和交換,把小的數(shù)交換到最前面茴厉。
*/
extension Array where Element:Comparable {
mutating func bubbleSort() {
for i in 0..<self.count-1 {
for j in (i+1...self.count-1).reversed() {
// 后者小于前者泽台,交換位置什荣,即小的往上升大的往下沉
if self[j] < self[j-1] {
swap(i: j, j: j-1)
}
}
}
}
}
因?yàn)槭桥判颍栽乇仨殱M(mǎn)足協(xié)議是可比較的怀酷。
下面快速排序和選擇排序也是同樣的道理稻爬。
2. 快速排序
快速排序的思想
源代碼這里先截下圖,想看的話可以去我github上下載源代碼
快速排序
接上圖
選擇排序這里就不說(shuō)了蜕依,大家可以自己嘗試寫(xiě)一下桅锄,有興趣可以去我github下載源代碼