1. 查找
1 二分查找(简单)
1 | package main |
头脑风暴:
- 一个循环搞定
- 先判断小于等于
2. 排序
1 快速排序🔥
https://leetcode-cn.com/problems/sort-an-array/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40package main
import "fmt"
func main() {
arr := []int{2, 1, 3, 11, 11, 33, 201, 150}
fmt.Println("origin", arr)
QuickSort(arr, 0, len(arr)-1)
fmt.Println("sort", arr)
}
func QuickSort(arr []int, left int, right int) {
if left < right {
partIndex := PartIndex(arr, left, right)
QuickSort(arr, left, partIndex-1)
QuickSort(arr, partIndex+1, right)
}
}
func PartIndex(arr []int, left int, right int) int {
base := arr[left]
baseIndex := left
for left < right { // 1. 两个大循环
for left < right && arr[right] >= base { // 2. 右边先走,大于等于
right--
}
for left < right && arr[left] <= base { // 3. 左边再走,小于等于
left++
}
arr[left], arr[right] = arr[right], arr[left] // 4. 开始交换
}
arr[baseIndex], arr[left] = arr[left], arr[baseIndex] // 5. 最后和基数交换
return left
}
//origin [2 1 3 11 11 33 201 150]
//sort [1 2 3 11 11 33 150 201]头脑风暴:
- 里面循环套循环
- 先判断小于
- 停止相遇要交换
2 堆排序
堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。大顶堆通常被用来进行”升序”排序,而小顶堆通常被用来进行”降序”排序。
1. 先维护堆性质的函数
与自己的孩子交换,交换后递归交换。

2. 再构建大顶堆
将待排序的序列建成大根堆。
需要有维护堆性质的函数,从后往前调用构建堆就可以了。
3. 不停交换达到堆排序
我们将堆顶其与末尾元素交换,使末尾元素为最大值,然后再调整堆顶元素使得剩下的 n−1 个元素仍为大根堆
再重复 2 的操作我们即能得到一个有序的序列。
1 | package main |
3 TopK
参考堆排序代码,先建堆。
1. topK
用小顶堆
1 | package main |
2 最小的k个数(简单) 最小K个数(中等)
使用大顶堆,和堆顶比较,堆顶大就直接换掉,接下来这个堆就是数字最小的大顶堆。
1 | package main |
3 数组中的第K个最大元素(中等)
使用的大顶堆, 需要全入堆
1 | func buildHeap(arr []int, size int) { |