golang实现数据结构基础算法

在这里插入图片描述

冒泡排序法:
每次都遍历数组里的最小或最大,两两之间比较
eg:
func sort(arr *[5]int){
fmt.Println(“排序前”)
fmt.Println(*arr)
temp :=0
for i :=0;i<len(*arr)-1;i++{
for j :=0;j<len(*arr)-1-i;j++{
if (*arr)[j]>(*arr)[j+1]{
temp=(*arr)[j+1]
(*arr)[j+1]=(*arr)[j]
(*arr)[j]=temp
}
}
}
fmt.Println(“排序后”)
fmt.Println(*arr)
}
选择排序法:
每次选择出排序后该位置相应的值,只是与改换位置的值互换位置
eg:
func Selectsort(arr *[6]int){
for j:=0;j<len(arr)-1;j++{
max:=arr[j]
maxIndex:=j
for i:=j+1;i<len(arr);i++{
if arr[i]>max{
max=arr[i]
maxIndex=i
}
}
//实现交换
if maxIndex!=j{
arr[maxIndex],arr[j]=arr[j],arr[maxIndex]
}
fmt.Printf(“第%d次 %v\n”,j+1,*arr)
}
}

插入排序:
//比较插入元素跟前面已经排序好的数组
//选择位置插入

时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性
直接插入排序 O(n2) O(n2) O(n2) O(n2) O(n)O(n) O(1)O(1) 稳定 简单
eg
func insertsort(arr *[7]int){
//从第二个元素开始选择插入
for j:=1;j<len(arr);j++{
insertval:=arr[j]
insertIndex:=j-1
//比较插入元素跟前面已经排序好的数组
//选择位置插入
//退出条件为Index>=0 && 插入的值>=Index元素
//循环条件,不断向前遍历,即index–
//元素逐渐后移
for insertIndex>=0 && insertval>=arr[insertIndex]{
arr[insertIndex+1]=arr[insertIndex]
insertIndex–
}

	if insertIndex!=j-1{
		//赋值在该在的位置
		arr[insertIndex+1]=insertval
	}
	fmt.Printf("第%d次插入%v\n",j,arr)
}

}

快速排序:
快速排序,说白了就是给基准数据找其正确索引位置的过程.
在这里插入图片描述

时间复杂度:
平均时间复杂度也是:O(nlogn)
最差的情况下时间复杂度为:O( n^2 )
快速排序的平均时间复杂度也是:O(nlogn)
空间复杂度:
最优的情况下空间复杂度为:O(logn)
最差的情况下空间复杂度为:O( n )

eg
package main
import(
“fmt”
)
//说明:
//1.left表示数组左边的下标
//2.right表示数组右边的下标
//3.array表示要排序的数组
func QuickSort(left int,right int,array *[9]int){
l:=left
r:=right
//pivot是中轴,支点
pivot:=array[(left+right)/2]
temp:=0
//for循环的目标是将比pivot小的数放在左边
//比pivot大的放右边
for ;l<r;{
//从pivot的左边找到大于等于pivot的值
for ;array[l]<pivot;{
l++
}
//从pivot的右边找到小于等于pivot的值
for ;array[r]>pivot;{
r–
}
//l>=r表明本次分解任务完成,break
if l>=r{
break
}
//交换
temp=array[l]
array[l]=array[r]
array[r]=temp
//优化
if array[l]==pivot{
r–
}
if array[r]==pivot{
l++
}
}

//如果l==r,再移动下
if l==r{
	l++
	r--
}
//向左递归
if left<r{
	QuickSort(left,r,array)
}
//向右递归
if right>l{
	QuickSort(l,right,array)
}

}
func main(){
//arr:=[9]int{-9,75,86,96,35,55,78,21,945}
arr:=[9]int{9,15,19,8,11,4,5,3,2}
fmt.Println(arr)
QuickSort(0,len(arr)-1,&arr)
fmt.Println(arr)
}

堆排序:
堆排序的基本思想是:将待排序序列构造成一个大顶堆(即二叉树),此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值