首页 > 编程语言 >golang的插入排序算法

golang的插入排序算法

时间:2022-12-02 20:32:46浏览次数:45  
标签:数列 插入排序 list 排好序 golang 插入 算法 排序

1、什么是插入排序?

先看一个例子:{7,6,1,9,3}无序数列中,我们约定好无序数列的第一个元素7作为有序数列{7},然后分别对{6,1,9,3}的数与7进行比较移位得到新的有序数列。

第一次迭代:{7} 6,1,9,3 拿出第二数6,插入到排好序的{7}中,与排好序的{7}进行比较,得到有序数列{6,7}

第二次迭代:{6,7} 1,9,3拿出第三个数1,插入到排好序的{6,7}中,与排好序的{6,7}数分别进行比较,得到有序{1,6,7}

第三次迭代:{1,6,7} 9,3拿出第四数9,插入到排好序的{1,6,7}中,与排好序的{1,6,7}数分别进行比较,得到有序{1,6,7,9}

第四次迭代:{1,6,7,9} 3拿出第五数3,插入到排好序的{1,6,7,9}中,与排好序的{1,6,7,9}数分别进行比较,得到有序{1,3,6,7,9}

插入排序例子:有些人打扑克时习惯从第二张牌开始,和第一张牌比较,第二张牌如果比第一张牌小那么插入到第一张牌前面,这样前两张牌都排好序了,接着从第三张牌开始,将它插入到已排好序的前两张牌里,形成三张排好序的牌,后面第四张牌继续插入到前面已排好序的三张牌里,直至排序完。

通过上面例子,相信已经对插入排序有概念上的理解了。


2、通过代码来实现插入排序

package main

import "fmt"

func InsertSort(list []int) {
n := len(list)
// 进行 N-1 轮迭代
for i := 1; i <= n-1; i++ {
//待排序的单元值
deal := list[i]
//待排序左边的单元值
j := i - 1
//左边的值大于待排序的值,那么就需要做比较插入相应位置。
if list[j] > deal {
for ; j >= 0 && list[j] > deal; j-- {
//第一次执行:list[0+1]=list[1]=list[0]
list[j+1] = list[j]
}
//第一次执行:j=-1,list[-1+1]=list[0]=deal,达到下标0值与下标1的值互换效果。
list[j+1] = deal
}
}
}

func main() {
list2 := []int{9, 5, 1, 6, 8, 14, 6, 49, 25, 4, 6, 3}
InsertSort(list2)
fmt.Println(list2)
}

golang的插入排序算法_插入排序

最好情况下,对一个已经排好序的数列进行插入排序,那么需要迭代 N-1​ 轮,并且因为每轮第一次比较,待排序的数就比它左边的数大,那么这一轮就结束了,不需要再比较了,也不需要交换,这样时间复杂度为:O(n)。

最坏情况下,每一轮比较,待排序的数都比左边排好序的所有数小,那么需要交换 N-1 次,第一轮需要比较和交换一次,第二轮需要比较和交换两次,第三轮要三次,第四轮要四次,这样次数是:1 + 2 + 3 + 4 + ... + N-1,时间复杂度和冒泡排序、选择排序一样,都是:O(n^2)。

因为是从右到左,将一个个未排序的数,插入到左边已排好序的队列中,所以插入排序,相同的数在排序后顺序不会变化,这个排序算法是稳定的。

在有大量元素的无序数列下,这些算法的效率都很低。


标签:数列,插入排序,list,排好序,golang,插入,算法,排序
From: https://blog.51cto.com/wyf1226/5907436

相关文章

  • 【算法】用面向对象的方法求出数组中重复 value的个数,按如下个数输出:
    1出现:1次3出现:2次8出现:3次2出现:4次int[]arr={1,4,1,4,2,5,4,5,8,7,8,77,88,5,4,9,6,2,4,1,5};今天看一个关于基础资料的文档,里面有这么一道算法题。刚开始看了一下,只......
  • 算法记录--好多内容也是借鉴大神的
    1、链表翻转/*publicclassListNode{intval;ListNodenext=null;ListNode(intval){this.val=val;}}*/publicclassSolutio......
  • Python中mro继承顺序查询之C3算法
    1.mro遍历顺序1. python中存在多继承:A同时继承B和C,B继承E,C继承F,E和F最终继承object,如果我们访问A的实例对象的属性,他的查找方法遵循C3算法,(之前是深度优先查询,一条路......
  • 蓝桥杯 ALGO-31算法训练 开心的金明
    时间限制:1.0s内存限制:256.0MB关键字:01背包动态规划问题描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,......
  • 蓝桥杯 ALGO-30算法训练 入学考试
    时间限制:1.0s内存限制:256.0MB关键字:0/1背包动态规划问题描述辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。......
  • 蓝桥杯 ALGO-29算法训练 校门外的树
    时间限制:1.0s内存限制:256.0MB关键字:区间处理问题描述某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的......
  • 蓝桥杯 ADV-103算法提高 逆序排列
    关键字循环语句数组操作问题描述编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中。当用户输入0时,表示输入结束。然后程序将把这个数组中的值按......
  • 蓝桥杯 ALGO-40算法训练 会议中心 (APIO 2009)
    时间限制:2.0s内存限制:512.0MB关键字:APIO2009会议中心Siruseri政府建造了一座新的会议中心。许多公司对租借会议中心的会堂很感兴趣,他们希望能够在里面举行会议。......
  • 蓝桥杯 ALGO-55算法训练 矩阵加法
    时间限制:1.0s内存限制:512.0MB问题描述给定两个N×M的矩阵,计算其和。其中:N和M大于等于1且小于等于100,矩阵元素的绝对值不超过1000。输入格式输入数......
  • 蓝桥杯 ALGO-45算法训练 调和数列问题
    问题描述输入一个实数x,求最小的n使得,1/2+1/3+1/4+…+1/(n+1)>=x。输入的实数x保证大于等于0.01,小于等于5.20,并且恰好有两位小数。你的程序要能够处理多组数据,即......