排序系列之插入排序

miloyang
0 评论
/ /
663 阅读
/
1482 字
20 2023-07

插入排序类似于斗地主扑克,我的习惯是从左至右按照从小到大先插好,然后来了一张牌后,再放到他对应的位置。

如:先来一个6,那么扑克肯定是一个,就在最左边。然后再来一个7,那就在6的右边,如果再来一个3呢?那他比7小,应该在7的左边,但目前7的左边是6,所以继续跟6比较,后面牌的插发应该是367。
同样的理解,应该有两个for循环,最外层那个是一张张牌逐步出,里层的for循环是当前手上的牌(已经有序了),和当前抓到的牌进行逐步的对比,如果他的值大于小于某个位置的左边,那么就在该位置插入。

释义

选择排序过程图示

代码

// 20, 12, 11, 3, 1
func InsertionSort(arr []int) {
    if len(arr) < 2 {
        return
    }
    for i := 1; i < len(arr); i++ {
        fmt.Println("i=", i)
        fmt.Println("-----------------")
                // j从i的循环过的位置-1开始,因为前面的都是有序的,把j的相隔位置的对比放入for循环中更为简洁
        for j := i - 1; j >= 0 && arr[j] > arr[j+1]; j-- {
            arr[j], arr[j+1] = arr[j+1], arr[j]
            fmt.Println("j=", j)
            fmt.Println(arr)
        }
    }
}
i= 1
-----------------
j= 0             
[12 20 11 3 1]   
i= 2             
-----------------
j= 1             
[12 11 20 3 1]   
j= 0             
[11 12 20 3 1]   
i= 3             
-----------------
j= 2             
[11 12 3 20 1]   
j= 1             
[11 3 12 20 1]   
j= 0             
[3 11 12 20 1]   
i= 4             
-----------------
j= 3             
[3 11 12 1 20]   
j= 2             
[3 11 1 12 20]   
j= 1             
[3 1 11 12 20]
j= 0
[1 3 11 12 20]
人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步