直接插入排序
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。原理像扑克牌抓牌动作一样,牌堆是无序的,手中的牌有序的,从牌堆中抓牌,并将牌根据手牌大小插入到手牌相应的位置。
算法
- 将待排序列分成
有序数据组
和无序数据组
- 取无序数据组第一个元素,与有序数据组的最后一个元素比较
- 有序数组依次向后移动,为待插入数据留出合适位置。
- 数据插入有序数组
- 重复
1-4
步骤
方法1
/*
* description:直接插入排序
* author:lucas
* date:2019-7-21
*/
func InsertSort(arr []int) {
for i, _ := range arr {
//有序数组下标初始化
preIndex := i-1
//待插入数
current := arr[i]
//有序数组依次后移动,为待插入数据留出位置
for preIndex >= 0 && current < arr[preIndex] {
//移动位置
arr[preIndex + 1] = arr[preIndex]
preIndex--
}
//待插入数据插入有序数组
arr[preIndex + 1] = current
}
}
方法2,有序数组不移动位置,而是有序数组和待插入数据直接依次比较交换
func InsertSort(arr []int) {
//把arr的第一个元素,作为有序数据组
for i:=1; i<len(arr); i++ {
//无序数据与前一个有序数据比较,只有小于时,需要完成插入操作
if arr[i] < arr[i - 1] {
for j:=i; j>0; j-- {
if arr[j] < arr[j-1] {
arr[j], arr[j-1] = arr[j-1], arr[j]
}
}
}
}
}