您的位置:首页 > 其它

学习回顾算法(直接插入排序)

2017-11-14 23:07 393 查看
直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好的序的表中,从而得到一个新的、记录数增1的有序表。

直接插入原理

当前元素的前面元素均为有序,要插入时,从当前元素的左边开始往前找(从后往前找),比当前元素大的元素都往右移一个位置,最后把当前元素放在已经放的位置就行了。

直接插入排序过程例子:

从网上找一个以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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: