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)
}
复制代码

 

posted @   潇潇暮鱼鱼  阅读(174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示