排序算法
常考排序
快速排序
//方法一
func QuickSort(_ nums:inout [Int]) -> [Int] {
// 思路:把一个数组分为左右两段,左段小于右段,类似分治法没有合并过程
quickSort(&nums, 0, nums.count - 1)
return nums
}
// 原地交换,所以传入交换索引
func quickSort(_ nums:inout [Int],_ start: Int,_ end: Int) {
if start < end {
// 分治法:divide
let pivot = partition(&nums, start, end)
quickSort(&nums, 0, pivot-1)
quickSort(&nums, pivot+1, end)
}
}
// 分区
func partition(_ nums:inout [Int],_ start: Int,_ end: Int) -> Int {
let p = nums[end]//参考点。排序:比p小的在左边,比p大的在右边
var i = start
for j in start..<end {
if nums[j] < p {
swap(&nums, i, j)
i += 1
}
}
// 把中间的值换为用于比较的基准值
swap(&nums, i, end)
return i
}
func swap(_ nums:inout [Int], _ i: Int,_ j: Int) {
let t = nums[i]
nums[i] = nums[j]
nums[j] = t
}
//方法二
func quickSort_a(data:[Int])->[Int]{
if data.count<=1 {
return data
}
var left:[Int] = []
var right:[Int] = []
let pivot:Int = 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_a(data: left)
result.append(pivot)
let rightResult = quickSort_a(data: right)
result.append(contentsOf: rightResult)
return result
}归并排序
堆排序
用数组表示的完美二叉树 complete binary tree
完美二叉树 VS 其他二叉树


核心代码
参考
练习
最后更新于
这有帮助吗?