这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。笔者在此之前并未完全掌握常规数据结构与算法,于是决定总结归纳一下go语言中常用的常规数据结构与算法。
1.什么是数据结构与算法?
数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素的集合。它包含三方面的内容,逻辑关系、存储关系以及操作。算法的含义是能够解决实际问题,输入的所有可能的合法的输入都能产生预期的正确的结果;能够在有穷的步骤内执行完程序;能够用最简短的语句最高效的完成任务。
2.为什么要学习数据结构与算法?
简而言之,学习数据结构能让我们更好的理清计算机中程序运行的逻辑,能看懂大神的代码;而学习算法则可以让我们拥有多种实现需求的方法,且实现起来更加简洁高效。
3.go中常用的2种排序算法
- 插入排序
插入排序是指将原来的数组看成无序数组,然后创建一个数组当成有序数组。每次取出无序数组中的第一个元素与有序数组中的元素进行比较并插入到一个合适的位置。
插入排序的时间复杂度非常两极化,平均/最差的时间复杂度是O(n^2),而最好的情况则只有O(n)。以下代码。
func insertionSort(arr []int) []int {\
for i := range arr {\
preIndex := i - 1\
current := arr[i]\
for preIndex >= 0 && arr[preIndex] > current {\
arr[preIndex+1] = arr[preIndex]\
preIndex -= 1\
}\
arr[preIndex+1] = current\
}\
return arr\
}
- 快速排序 快速排序是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。
快速排序的算法思想:首先任意选出一个数组中的元素当作基准。以此基准将数组分为大于基准的元素和小于基准的元素并分别排序在基准数的前后。然后前后分别再次进行快速排序直至对所有数都已实行过快速排序。
相比于插入排序,快速排序的最差时间复杂度与之一样,平均时间复杂度则只有O(n*logn)。以下代码。
func partition(arr []int, left, right int) int {
pivot := left
index := pivot + 1
for i := index; i <= right; i++ {
if arr[i] < arr[pivot] {
swap(arr, i, index)
index += 1
}
}
swap(arr, pivot, index-1)
return index - 1
}
func swap(arr []int, i, j int) {
arr[i], arr[j] = arr[j], arr[i]
}
4.总结
这次介绍了一些十分基础的排序算法。算是自己对基础的回忆。下一篇文章将讲一些深入的算法。