插入排序:从一个无序队列中抽取一个数插入到已经排好序的队列中,要求被插入的队列依然保持有序
时间复杂度 : O(n^2)
稳定性 :稳定
代码实现
func inserSort(arr []int) []int{
l := len(arr)
for i:=0;i<l;i++{
data := arr[i] // 被抽取的数
j := i-1 // 从尾到头遍历
for ;j>=0;j--{
if arr[j]>data{
arr[j+1] = arr[j] // 往后移动元素
}else{ // 已经排好序,不需要再继续执行
break
}
}
arr[j+1] = data // 插入数据
}
return arr
}
希尔排序(插入排序优化):在插入排序的基础上进行添加分段处理,添加一个步长比较,使每次做插入排序的数组尽可能有序,这样break的情况就会增加,就可以减少数组移动
时间复杂度 : O(n^2)或者说不确定,但一般比插入排序较优
稳定性 :不稳定
代码实现
func helSort(arr []int) []int{
l := len(arr)
for step := l/2;step >0;step /=2{ // 增量
//以下全部是插入排序的实现,唯一区别在于插入排序增量为1,而希尔排序增量为step
for i:=step;i<l;i += step{
data := arr[i]
j := i - step
for ;j>=0;j-=step{
if arr[j]>data{
arr[j+step]=arr[j]
}else{
break
}
}
arr[j+step]=data
}
}
return arr
}
总结
插入排序和希尔排序很相似,唯一区别在于希尔排序添加分段思想,尽可能将分段排好序之后再做插入排序,
使数组移动的元素不那么频繁,实现优化,但是希尔排序不稳定,需要谨慎使用