go语言实现排序--插入排序

直接插入排序

相信大家对直接插入排序都不陌生,通俗来说就是每次取要排序数组内的第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,这种情况下效率较高,如果你是大数据集时的时候,可以考虑一下,如果数据比较少,感觉差距不会很大

猜你喜欢

转载自blog.csdn.net/LYue123/article/details/88326677
今日推荐