学习回顾算法(直接插入排序)
2017-11-14 23:07
393 查看
直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好的序的表中,从而得到一个新的、记录数增1的有序表。
直接插入原理
当前元素的前面元素均为有序,要插入时,从当前元素的左边开始往前找(从后往前找),比当前元素大的元素都往右移一个位置,最后把当前元素放在已经放的位置就行了。
直接插入排序过程例子:
从网上找一个以21、25、49、25、16、8为元素的数排序:
![](https://img-blog.csdn.net/20171114221331411?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbTBfMzgxMzI0MjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20171114221536980?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbTBfMzgxMzI0MjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
算法分析
(1)时间复杂度
如果各个元素的初始状态是正序的,一次扫描即可完成排序,所需比较的次数C和记录移动次数M都达到了最小值.C=n-1,M=0。这时候插入排序最好的时间复杂度为O(n)。
如果各个元素是反序的,需要进行n-1此排序。每次排序要进行n-i次元素值的比较(1<=i<=n-1),且每次比较都要移动i - 1次。
综上,冒泡排序的平均时间复杂度是O(n^2)。
(2)空间复杂度
插入排序过程中只需要一个临时变量来存储待插入元素,所以需要的额外空间为1,空间复杂度为O(1)
(3)算法稳定性。
插入排序相同的元素不发生交换,前后顺序没有发生改变,所以插入排序是一种稳定的排序算法。
结果:
直接插入原理
当前元素的前面元素均为有序,要插入时,从当前元素的左边开始往前找(从后往前找),比当前元素大的元素都往右移一个位置,最后把当前元素放在已经放的位置就行了。
直接插入排序过程例子:
从网上找一个以21、25、49、25、16、8为元素的数排序:
算法分析
(1)时间复杂度
如果各个元素的初始状态是正序的,一次扫描即可完成排序,所需比较的次数C和记录移动次数M都达到了最小值.C=n-1,M=0。这时候插入排序最好的时间复杂度为O(n)。
如果各个元素是反序的,需要进行n-1此排序。每次排序要进行n-i次元素值的比较(1<=i<=n-1),且每次比较都要移动i - 1次。
综上,冒泡排序的平均时间复杂度是O(n^2)。
(2)空间复杂度
插入排序过程中只需要一个临时变量来存储待插入元素,所以需要的额外空间为1,空间复杂度为O(1)
(3)算法稳定性。
插入排序相同的元素不发生交换,前后顺序没有发生改变,所以插入排序是一种稳定的排序算法。
实现
1、golang实现package main import ( "fmt" ) func InsertSort(values []int) { Len := len(values) //从第二个元素开始比较 for i := 1; i < Len; i++ { //用中间元素存储用于比较的元素,并让出比较元素的位置。 value := values[i] //从右往边第一个开始比较 j := i - 1 //从右往左边,如果元素大于插入元素,往右边移动 for values[j] > value { values[j+1] = values[j] 如果元素是第一个了就退出比较 if j == 0 { j = j - 1 break } j = j - 1 } //将待插入元素插入到右边元素都比元素大的位置。 values[j+1] = value } } func main() { values := []int{4, 93, 84, 85, 80, 37, 81, 93, 27, 12} fmt.Println(values) BubbleSort(values) fmt.Println(values) return }
结果:
[4 93 84 85 80 37 81 93 27 12] [4 12 27 37 80 81 84 85 93 93]
相关文章推荐
- 经典算法学习——直接插入排序
- [算法学习笔记]直接插入排序笔记
- 数据结构与算法学习之路:直接插入排序
- 一步步学习数据结构和算法之直接插入排序效率分析及java实现
- 学习算法手记【原】- 直接插入排序
- 算法笔记--直接插入排序
- Java常见排序算法之直接插入排序
- 小蚂蚁学习数据结构(35)——直接插入排序
- 基础算法之二 直接插入排序的三种实现
- 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
- 第十六周 项目1 验证算法 直接插入排序 折半插入排序
- 算法---直接插入排序法
- C语言算法实例019:直接插入排序
- 白话经典算法系列之二 直接插入排序的三种实现
- 白话经典算法系列之二 直接插入排序的三种实现
- 第十五周项目1 验证算法(1)插入排序之直接插入排序
- 算法学习记录3 插入排序
- 算法 - 排序 - 直接插入排序
- 排序算法之直接插入排序