func sort(arr: inout [Int]) { let size = arr.count for j in 0..<size { for i in 1..<size-j { if arr[i] < arr[i-1] { let tmp = arr[i] arr[i] = arr[i-1] arr[i-1] = tmp } } } }
# improve # 因为冒泡中无论是否有序都会进行交换操作,所以可以做一个判断提前退出
func sort(arr: inout [Int]) { let size = arr.count for j in 0..<size { var isSorted = true for i in 1..<size-j { if arr[i] < arr[i-1] { let tmp = arr[i] arr[i] = arr[i-1] arr[i-1] = tmp isSorted = false } } if isSorted { break } } }
选择排序
1 2 3 4 5 6 7 8 9 10 11
func sort(arr: inout [Int]) { for i in 0..<arr.count { var tmp = i for j in i..<arr.count { if arr[tmp] > arr[j] { tmp = j } } arr.swapAt(i, tmp) } }
func sort(arr: inout [Int]) { for i in 1..<arr.count { var tmp = i let tmpValue = arr[i] while tmp > 0 && arr[tmp-1] > tmpValue { arr[tmp] = arr[tmp-1] tmp -= 1 } arr[tmp] = tmpValue } }
# 相对简洁的写法,但是不标准,因为是交换,每次比较多了一次赋值操作 func sort(arr: inout [Int]) { for i in 1..<arr.count { var tmp = i while tmp > 0 && arr[tmp-1] > arr[tmp] { arr.swapAt(tmp, tmp-1) tmp -= 1 } } }
希尔排序
希尔排序是简单插入排序的进阶版本,gap 一般取数组大小的 1/2 到 1/3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
func sort(arr: inout [Int]) { var gap = arr.count/2 while gap > 0 { for i in gap..<arr.count { var j = i let tmp = arr[i] while j-gap >= 0 && arr[j-gap] > tmp { arr[j] = arr[j-gap] j -= gap } arr[j] = tmp } gap /= 2 } }
for i in left...right { tmp[i] = arr[i] } var fir = left var sec = middle+1 for j in left...right { if fir > middle { arr[j] = tmp[sec] sec += 1 }else if sec > right { arr[j] = tmp[fir] fir += 1 }else if tmp[fir] < tmp[sec] { arr[j] = tmp[fir] fir += 1 }else { arr[j] = tmp[sec] sec += 1 } } }
func split(_ tmp: inout [Int], _ left: Int, _ right: Int) { if left >= right { return } let pa = merge(&tmp, left, right) split(&tmp, left, pa-1) split(&tmp, pa+1, right) }
func merge(_ tmp: inout [Int], _ left: Int,_ right: Int) -> Int { var mark = left let prov = tmp[left] for i in (left+1)...right { if tmp[i] < prov { mark += 1 tmp.swapAt(i, mark) } } tmp.swapAt(left, mark) return mark } }
func sort(arr: [Int]) -> [Int]{ var count = 0 for num in arr { count = max(count, num) } var tmp = [Int](repeating: 0, count: count+1) var ans = [Int]() for num in arr { tmp[num] += 1 } for res in 0..<tmp.count { var cc = tmp[res] while cc > 0 { ans.append(res) cc -= 1 } } return ans }
func sort(arr: [Int]) -> [Int]{ var maxbucket = 0 var minbucket = 0 for tmp in arr { if tmp > maxbucket { maxbucket = tmp }else if tmp < minbucket { minbucket = tmp } } let diff = maxbucket - minbucket // bucketCount 可通过外部参数获取 let bucketCount = 5 let count = diff/bucketCount+1 var ans = [[Int]](repeating: [], count: count) for tmp in arr { ans[(tmp-minbucket)/count].append(tmp) } var res = [Int]() for array in ans { // 对桶内元素排序 for num in array { res.append(num) } } return res }
func sort(arr: [Int]) -> [Int]{ var mod = 10 var dev = 1 var digit = true var buckets = [[Int]](repeating:[] , count: 10) var nums = arr while digit { digit = false while nums.count > 0 { let num = nums.removeFirst() buckets[num%mod/dev].append(num) if num > mod { digit = true } } for i in 0..<buckets.count { while buckets[i].count > 0 { nums.append(buckets[i].removeFirst()) } } mod *= 10 dev *= 10 } return nums }