插入排序类似于斗地主扑克,我的习惯是从左至右按照从小到大先插好,然后来了一张牌后,再放到他对应的位置。
如:先来一个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]