个人评价:快排,没啥多说的,用内置函数有何不可?何必那么卷

题目难度:🌟 (参考 LeeCode 简单🌟 、中等🌟 🌟 、困难🌟 🌟 🌟 )

另,通常算法题会考察分析时间复杂度和空间复杂度,可参考笔者之前的文章

「数据结构&算法」必知必会系列:3. 时间 & 空间复杂度(下)

最小的k个数

题目描述

剑指 Offer 40. 最小的k个数

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例 1:

输入:arr = [3,2,1], k = 2

输出:[1,2] 或者 [2,1]

示例 2:

输入:arr = [0,1,2,1], k = 1

输出:[0]

限制:

0 <= k <= arr.length <= 10000 0 <= arr[i] <= 10000

解题思路

典型的快排,Go 内置 sort 本身就是优化后的排序,为何不用呢 😁

func getLeastNumbers(arr []int, k int) []int {
    sort.Ints(arr)
    return arr[:k]
}

总结

与其考察手写快排,不如说下 Go 中 sort 包实现吧?回到起点的第一篇有提到哦

💯【算法面试】Go题解 1.找出数组中重复的数字

sort 包会根据实际数据自动选择高效的排序算法 🐂

sort 包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。 但是这四种排序方法是不公开的,它们只被用于 sort 包内部使用。

有时间的 TX 可以深入看下源码,排序的注释很清晰明了,还加了复杂度说明 👍

可用作排序算法的代码示例 (^U^)ノ~YO

上述题解,对[]int 切片排序更常使用 sort.Ints(),时间复杂度 O(nlogn) (快排)