携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
前言
现在算法面试,是很多公司面试的第一道门槛。排序算法就是对一序列对象根据某关键字进行排序。算法的好坏主要根据时间复杂度和空间复杂度来决定。本文主要介绍常见的十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、计数排序、基数排序、桶排序、堆排序。将主要讲述比较常见的几个排序算法。
基本排序
冒泡排序
基本思路
像水泡一样,越到水面气泡越大。主要通过不断的比较相邻的元素。如果第一个比第二个大就交换它们。每一对相邻元素都做相同的工作,这样就会将最大交换到最后。
通过使用 2个循环,第一个循环控制轮次,第二个循环控制相邻元素的比较。因是两个互相比较所以循环控制到倒数第二个即可。
代码示例
func Bubble() []int {
var arr []int = []int{3, 44, 38, 5, 47, 15, 2, 26, 27}
// 临界 如果数组少于等于 1个,则只需要比较直接返回
if len(arr) > 1 {
// 外层控制轮次
for i := 0; i < len(arr)-1; i++ {
// 内层进行相邻元素比较
for j := 0; j < len(arr)-1-i; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
}
return arr
}
插入排序
基本思路
将已排序好的数据插入到排好序的部分。
使用嵌套循环,第一层循环,是待排序的元素要与第二层里已排序好的所有元素进行对比。初始第一个元素当作是已排好序。
3, 44, 38, 5, 47, 15, 2, 26, 27
第一轮:3为已排好序,44待排序,44>3 保持不变[3, 44, 38, 5, 47, 15, 2, 26, 27]
第二轮:3,44 为已排好序,38待排序,38分别和[3,44]比较,得到结果 [3,38,44,5, 47, 15, 2, 26, 27]
依次循环下去...
代码示例
func InsertSort() []int {
var arr []int = []int{3, 44, 38, 5, 47, 15, 2, 26, 27}
for i := 1; i < len(arr); i++ {
cur := arr[i] // 待排序的值
var j int
// 第二层循环,就是前面已排好序的进行比较
for j = i - 1; j >= 0 && arr[j] > cur; j-- {
arr[j+1] = arr[j]
}
//第二层循环结束时,j+1 的位置就是 cur 要插入的位置
arr[j+1] = cur
}
return arr
}