算法基础(golang版本)——插入排序

插入排序,顾名思义就是利用插入的方式进行排序,他的演绎过程就好比斗地主的时候摸牌的过程。假设我们手上有2,3,5,10这4张牌,这时候从牌桌里摸上一张7,这时候为了插入到合适的位置一般会从右边开始进行对比,例如10大于7那么,7应该往左偏移进行比较,然后再看5小于7,那么7就应该放在5的右边,这时候7就插入到下标为3的位置,同时10往右挪一个位置。这就是插入排序的演绎过程。

一。基于以上演绎过程,我们用golang来进行实现:

func insertion(data []int) {
	for j := 1; j < len(data); j++ {
		key := data[j]
		i := j - 1
		for i >= 0 && data[i] > key {
			data[i+1] = data[i]
			i = i - 1
		}
		data[i+1] = key
	}
}
func main() {
	//插入排序算法golang版本
	data := []int{5, 2, 4, 6, 1, 3}
	fmt.Printf("before sort %v\n", data)
	insertion(data)
	fmt.Printf("after sort %v\n", data)
}

二。分析算法过程
1.首先for循环里第一行我们将key赋值为data[j],这里取的是data[1],而下标j=1是小于len(data)的,这里就满足了循环不变式成立。

2.此时赋值i=j-1,我们从上面摸牌的过程已经得知,拿到当前的元素与左边的所有的元素进行比较,直到左边的元素不再大于当前元素位置。因此首先我们拿data[1]对比data[0],这里的data[1]=2,而data[0]=5,dats[0]>data[1]满足内循环要求,所以此时进行交换位置,data[i+1]=data[0+1]=data[1]=data[0],也就是将5与2的位置进行交换,同时i=i-1往左偏移再次进行循环判断。此时i=0-1=-1<0不满足循环,因此推出内循环体。

3.最后一步将data[i+1]的位置赋值为key,达到交换的目的。再次进入下一个外循环j++以此类推。

三。算法分析图解
在这里插入图片描述
四。总结
插入排序是一个比较有效常用的算法,它的时间复杂度平均是O(n*n),算法并不是说一定得使用时间复杂度以及空间复杂度都非常低的,而是选择性的使用,例如插入排序在少量排序的情况下其效率还是蛮不错的。杀鸡用什么到刀取决于实际场景。

©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页