直接插入排序
相信大家对直接插入排序都不陌生,通俗来说就是每次取要排序数组内的第i个数,在前i-1个数中,进行比较,找到正确的位置,插入即可。
代码:
func Insert(nums []int,n int) []int{ //直接插入排序
for i:=1;i<n;i++{
num:=nums[i]
end:=i-1
for end>=0 && nums[end]>num{
nums[end+1]=nums[end]
end--
}
nums[end+1]=num
}
return nums
}
分析:对于直接插入排序,平均时间复杂为O(n^2),空间复杂度为O(1),可见时间复杂度是比较高的,这是因为,要找到这个数的位置,就需要一个一个比较,接下来我们稍微优化一下,减少一下比较次数,可能有的同学想到了,没错就是用二分查找
二分查找插入排序法
前面不变,只是在查找位置插入的时候,用二分查找就好
代码:
func TwoInsert(nums []int,n int) []int { //二分直接插入排序
for i:=0;i<n;i++{
temp:=nums[i]
first:=0
end:=i-1
for first<=end{
mid:=first+(end-first)/2
if nums[mid]<temp{
first=mid+1
}else{
end=mid-1
}
}
end=i-1
for end>=first{
nums[end+1]=nums[end]
end--
}
nums[first]=temp
}
return nums
}
希尔排序
希尔排序也是插入排序,他的改进在于,每次给定一个key值,相邻的key个元素为一组,进行插入排序,然后key–,直到key=0,排序结束
代码:
func Shellsort(nums []int,n int)[]int{
gap:=3
for gap>=0 {
for i:=gap;i<n;i++{
key:=nums[i]
end:=i-gap
for end>=0 && nums[end]>key{
nums[end+gap]=nums[end]
end -=gap
}
nums[end+gap]=key
}
gap--
}
return nums
}
这里我们是给定了一个key值为3.我看过一个,经过多次实验,发现key=size key=key/3+1,这种情况下效率较高,如果你是大数据集时的时候,可以考虑一下,如果数据比较少,感觉差距不会很大