golang 排序
排序都使用数组进行元素的保存
1.冒泡排序。
冒泡排序,从左到右,把后一个元素与前一个元素做比较,小的往前移位。
1)一共会经过arr.length-1次的轮数比较,每一轮会确定一个数的位置
2)每一轮的比较次数在逐渐的减少
3) 当前面一个数比后面一个数大的时候就进行交换
4) f2函数没有返回值,在main函数中没有接收而是直接打印的arr1,因为用的是切片是引用类型会直接改变实参是数值,如果使用数组的话需要用数组的指针,因为数组是传值类型的。
func f2(arr1 []int) { for j := 0; j < len(arr1)-1; j++ { for i := 0; i < len(arr1)-1-j; i++ { if arr1[i+1] < arr1[i] { var temp int = 0 temp = arr1[i] arr1[i] = arr1[i+1] arr1[i+1] = temp } } } }
func main() {
arr1 := []int{24, 69, 80, 57, 13}
f2(arr1)
fmt.Println(arr1)
}
2.直接选择排序,将第n个值依此与后面的值作比较,如果这个值大于这个后面的值则做一次交换
//直接选择排序:将第n个值依此与后面的值作比较,如果这个值大于这个后面的值则做一次交换 func f1(arr1 []int) { for i := 1; i < len(arr1); i++ { for j := 0; j < i; j++ { if arr1[i] < arr1[j] { var temp int = 0 temp = arr1[j] arr1[j] = arr1[i] arr1[i] = temp } } } } func main() { arr1 := []int{24, 69, 80, 57, 13} f1(arr1) fmt.Println(arr1) }
3.查找
有两种查找方式:顺序查找;二分查找(有序数组,排序完了才能进行查找)
1)顺序查找:查找某个字符串属于某个切片
使用了闭包函数,使切片只用传一次,就固定下来,后面每次调用函数是调用的f2只传字符串进行判断。
func f1(arr1 []string) func(s1 string) bool { return func(s1 string) bool { for _, key := range arr1 { if s1 == key { return true } } return false } } func main() { arr1 := []string{"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"} var s1 string fmt.Println("请输入一个名字:") fmt.Scanln(&s1) f2 := f1(arr1) res := f2(s1) fmt.Println(res) }
2)二分查找
1.假设要查找的数是findval, arr1是一个有序数组,并且是从小到大排序
2.先找到中间的下标middle=(leftindex+rightindex)/2,然后再让中间下标的值arr1[middle]与findval做比较
2.1如果arr1[middle] > findval,就应该向leftindex -- (middle -1)
2.1如果arr1[middle] < findval,就应该向 (middle +1) -- rightindex
2.3如果arr1[middle] == findval,就找到
循环2.1 2.2 2.3的步骤
func fd(arr1 []int) func(n1 int) bool { return func(n1 int) bool { t1 := 0 t2 := len(arr1) - 1 t3 := t2 / 2 fmt.Println("t3=", t3) if n1 > arr1[t2] { return false } for i := 0; i < len(arr1); i++ { if n1 == arr1[3] || n1 == arr1[t1] || n1 == arr1[t2] { return true } if n1 > arr1[t3] { t1 = t3 + 1 t3 = (t2 + t1) / 2 } else { t2 = t3 t3 = (t2 + t1) / 2 } fmt.Println(t1, t2, t3) } return false } } func main() { var n1 int arr1 := []int{1, 8, 10, 89, 100, 200, 349, 455, 788, 1000} fmt.Println("请输入一个数:") fmt.Scanln(&n1) f1 := fd(arr1) res := f1(n1) fmt.Println(res) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?