现在的面试真的是越来越卷了,算法已经成为了面试过程中必不可少的一个环节,你如果想进稍微好一点的公司,「算法是必不可少的一个环节」。那么如何学习算法呢?很多同学的第一反应肯定是去letcode上刷题,首先我并不反对刷题的方式,但是对于一个没有专门学习过算法的同学来说,刷题大部分是没什么思路的,花一个多小时暴力破解一道题意义也不大,事后看看别人比较好的解法大概率也记不住,所以我觉得「专门针对算法进行一些简单的训练」是很有必要的,正好我自己最近也在学习,同时把学习成果同步更新在公众号上,可能会更很多期,希望能帮助到你。另外最近很多同学也都在学习go,所以我就用go代码演示算法。今天咱们闲话不用多说,就从最简单的开始
五种基础排序算法对比
http://mpvideo.qpic.cn/0bc3jeaayaaaxuabub4dyrrfasodbreqadaa.f10004.mp4?dis_k=e628fa8a8fdb6e07086da5eb262ed014&dis_t=1653958428&vid=wxv_2401926731357323266&format_id=10004&support_redirect=0&mmversion=false 冒泡排序
func bubbleSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
for e := len(arr) - 1; e > 0; e-- {
for i := 0; i < e; i++ {
if arr[i] > arr[i+1] {
Swap(arr, i, i+1) //交换元素
}
}
}
return arr
}
func Swap(arr []int, i, j int) []int {
temp := arr[j]
arr[j] = arr[i]
arr[i] = temp
return arr
}
n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:
http://mpvideo.qpic.cn/0bc3liaawaaae4abzkmd5brfawwdbnnaacya.f10004.mp4?dis_k=c703490cff80ae7164e2fd4633b26084&dis_t=1653958428&vid=wxv_2401929021111762944&format_id=10004&support_redirect=0&mmversion=false 选择排序
func selectSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
for i := 0; i < len(arr); i++ {
var minIndex int = i
for j := i + 1; j < len(arr); j++ {
if arr[j] < arr[minIndex] {
minIndex = j
}
}
arr = Swap(arr, i, minIndex)
}
return arr
}
func Swap(arr []int, i, j int) []int {
temp := arr[j]
arr[j] = arr[i]
arr[i] = temp
return arr
}
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
http://mpvideo.qpic.cn/0bc3kaaayaaazqabwv4dzzrfaugdbriaadaa.f10002.mp4?dis_k=4fd441fb7025d9bae982f154737fb93b&dis_t=1653958428&vid=wxv_2401929550349041670&format_id=10002&support_redirect=0&mmversion=false 插入排序
func insertSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
for i := 1; i < len(arr); i++ {
for j := i - 1; j >= 0; j-- {
if arr[j] > arr[j+1] {
Swap(arr, j, j+1)
}
}
}
return arr
}
func Swap(arr []int, i, j int) []int {
temp := arr[j]
arr[j] = arr[i]
arr[i] = temp
return arr
}
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
http://mpvideo.qpic.cn/0bc3geaayaaaduabim4dwnrfamodbqyqadaa.f10002.mp4?dis_k=7468f6a72f8d3f64b3c4ddb0444fde32&dis_t=1653958428&vid=wxv_2401931959506927618&format_id=10002&support_redirect=0&mmversion=false 快速排序
//快速排序
func quickSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
middle := arr[0]
var left []int
var right []int
for i := 1; i < len(arr); i++ {
if arr[i] > middle {
right = append(right, arr[i])
} else {
left = append(left, arr[i])
}
}
middle_s := []int{middle}
left = quickSort(left)
right = quickSort(right)
arr = append(append(left, middle_s...), right...)
return arr
}
完