快速排序算法在Swift編程中的幾種代碼實現(xiàn)示例
總所周知 快速排序由于排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經(jīng)常被采用。
基本原理是:
數(shù)組a = [1,3,5,7,6,4,2]
1 選定一個 基準 a[0]
2 把比 a[0]小的放左邊,比a[0]大的放右邊. 中斷遞歸如果少于兩個數(shù)字 則不執(zhí)行。
3 然后再分別對兩邊 執(zhí)行 1,2,3操作。
對快速排序 的 想法
1 在待排序元素 大部分是有序的情況下, 速度 非常很快。
2 在最差的情況下,速度就很慢了。 相當于冒泡了
3 所以 快排的 優(yōu)化, 定基準 非常重要,例如待排序是有序的,基準定在中間,xiao'lv
4 時間復雜度為nlogn,不穩(wěn)定排序
輔助空間
func quickSort(data:[NSInteger])->[NSInteger]{ if data.count<=1 { return data } var left:[NSInteger]=[] var right:[NSInteger]=[] let pivot:NSInteger=data[data.count-1] for index in 0..<data.count-1 { if data[index]<pivot { left.append(data[index]) }else{ right.append(data[index]) } } var result=quickSort(left) result.append(pivot) let rightResult=quickSort(right) result.appendContentsOf(rightResult) return result }
經(jīng)典快排
func partition(inout data:[NSInteger],low:NSInteger,high:NSInteger) -> NSInteger { let root = data[high] var index = low for i in low...high { if data[i]<root { if i != index { swap(&data[i], &data[index]) } index = index+1 } } if high != index { swap(&data[high], &data[index]) } return index } func quickSort(inout data:[NSInteger],low:NSInteger,high:NSInteger) -> Void { if low>high { return } let sortIndex = partition(&data, low: low, high: high) quickSort(&data, low: low, high: sortIndex-1) quickSort(&data, low: sortIndex+1, high: high) }
測試代碼:
var data:[NSInteger] = [1,2,3,2,4,8,9,10,19,0] var result=quickSort(data) print("FlyElephant方案1:-\(result)") var arr:[NSInteger] = [10,3,17,8,5,2,1,9,5,4] quickSort(&arr, low: 0, high: arr.count-1) print("FlyElephant方案2:-\(arr)")
極簡版本
import UIKit extension Array { var decompose : (head: Element, tail: [Element])? { return (count > 0) ? (self[0], Array(self[1..<count])) : nil } } func qsortDemo(input: [Int]) -> [Int] { if let (pivot, rest) = input.decompose { let lesser = rest.filter { $0 < pivot }//這里是小于于pivot基數(shù)的分成一個數(shù)組 let greater = rest.filter { $0 >= pivot }//這里是大于等于pivot基數(shù)的分成一個數(shù)組 return qsortDemo(lesser) + [pivot] + qsortDemo(greater)//遞歸 拼接數(shù)組 } else { return [] } } var a:[Int] = [1,2,4,6,2,4,3,7,8] qsortDemo(a)
相關文章
switch循環(huán)所支持的數(shù)據(jù)類型案例分析
這篇文章主要介紹了switch循環(huán)所支持的數(shù)據(jù)類型,本文通過實際案例講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06swift實現(xiàn)自動輪播圖效果(UIScrollView+UIPageControl+Timer)
這篇文章主要為大家詳細介紹了swift實現(xiàn)自動輪播圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09