Go 数据结构和算法篇(五):插入排序

Go语言中文网 昨天

以下文章来源于xueyuanjun ,作者xueyuanjun

实现原理

今天继续介绍排序算法 —— 插入排序。

插入排序的原理是:我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。

整体流程如下图所示:

插入排序图示

在这里搭配动态图查看效果更佳:https://visualgo.net/zh/sorting。

示例代码

插入排序也比较简单,对应的 Go 实现代码如下:

package main

import "fmt"

func insertionSort(nums []int) []int {    if len(nums) <= 1 {        return nums    }

    for i := 0; i < len(nums); i++ {       // 每次从未排序区间取一个数据 value        value := nums[i]        // 在已排序区间找到插入位置        j := i - 1        for ; j >= 0; j-- {           // 如果比 value 大后移            if nums[j] > value {                nums[j+1] = nums[j]            } else {                break            }        }        // 插入数据 value        nums[j+1] = value    }

    return nums}

func main() {    nums := []int{4, 5, 6, 7, 8, 3, 2, 1}    nums = insertionSort(nums)    fmt.Println(nums)}

运行上述代码,打印结果如下:

性能分析

我们来看下插入排序的性能和稳定性:

  • 插入排序需要两个嵌套的循环,时间复杂度是O(n2);

  • 没有额外的存储空间,是原地排序算法;

  • 不涉及相等元素位置交换,是稳定的排序算法。

插入排序的时间复杂度和冒泡排序一样,也不是很理想,但是插入排序不涉及数据交换,从更细粒度来区分,性能要略优于冒泡排序。

(本文完)

(0)

相关推荐

  • 算法创作 | 0到n-1中缺失的数字问题解决方法

    问题描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字.示例1:输入:[0,1,3 ...

  • (1条消息) 漫画:动态规划系列 第三讲

    在上一篇中,我们了解了什么是DP(动态规划),并且通过DP中的经典问题 "最大子序和",学习了状态转移方程应该如何定义.在本节中,我们将沿用之前的分析方法,通过一道例题,进一步巩固 ...

  • 七大排序算法总结

    以下所有动图均来源于一像素博客园 以下代码均使用C 编写 完整代码请到这里下载 稳定排序算法:冒泡排序.插入排序.归并排序 时间复杂度不受数据影响:选择排序.归并排序.堆排序 时间复杂度基本小于n2: ...

  • 漫画:知乎面试题(旋转数组最小值Ⅱ

    今天是小浩算法"365刷题计划"第72天.继续为大家讲解二分法系列篇 - 旋转排序数组最小值Ⅱ(进阶版).话不多说,直接看题: 01 PART 旋转排序数组最小值Ⅱ 昨天为大家讲解 ...

  • Python中几种常见的排序算法?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • Go 数据结构和算法篇(十四):哈希表、哈希函数、哈希冲突和哈希算法

    Go语言中文网 今天 以下文章来源于xueyuanjun ,作者xueyuanjun 一.哈希表 哈希表(HashTable,也叫散列表),是根据键名(Key)直接访问对应内存存储位置的数据结构. 其 ...

  • Go 数据结构和算法篇(十一):字符串匹配之 BF 算法

    Go语言中文网 前天以下文章来源于xueyuanjun ,作者xueyuanjun xueyuanjun学院君的订阅号,我会在这里持续更新优质全栈编程技术教程,包括但不限于 Golang.PHP.Ja ...

  • Go 数据结构和算法篇(十二):字符串匹配之 KMP 算法

    昨天 以下文章来源于xueyuanjun ,作者xueyuanjun xueyuanjun学院君的订阅号,我会在这里持续更新优质全栈编程技术教程,包括但不限于 Golang.PHP.JavaScrip ...

  • Go 数据结构和算法篇(十):二分查找的变形版本

    Go语言中文网 今天 以下文章来源于xueyuanjun ,作者xueyuanjun 日常开发过程中,除了我们上篇讲到的正常的二分查找,还有很多二分查找的变形版本,今天开始,我们就来给大家一一介绍这些 ...

  • Go 数据结构和算法篇(九):二分查找

    今天 以下文章来源于xueyuanjun ,作者xueyuanjun 介绍完基本的线性表排序算法后,今天我们来介绍一种常见的线性表查找算法 -- 二分查找. 一.二分查找的引入 对于基于数字索引的数组 ...

  • Go 数据结构和算法篇(八):快速排序

    今天 以下文章来源于xueyuanjun ,作者xueyuanjun xueyuanjun学院君的订阅号,我会在这里持续更新优质全栈编程技术教程,包括但不限于 Golang.PHP.JavaScrip ...

  • Go 数据结构和算法篇(七):归并排序

    Go语言中文网 昨天 以下文章来源于xueyuanjun ,作者xueyuanjun xueyuanjun学院君的订阅号,我会在这里持续更新优质全栈编程技术教程,包括但不限于 Golang.PHP.J ...

  • Go 数据结构和算法篇(六):选择排序

    今天 以下文章来源于xueyuanjun ,作者xueyuanjun xueyuanjun学院君的订阅号,我会在这里持续更新优质全栈编程技术教程,包括但不限于 Golang.PHP.JavaScrip ...

  • Go 数据结构和算法篇(四):冒泡排序

    Go语言中文网 今天 以下文章来源于xueyuanjun ,作者xueyuanjun 今天给大家介绍的是基于选择的排序算法,常见基于选择的排序算法有冒泡排序.插入排序.选择排序.归并排序和快速排序,我 ...