go的二分法查找

这篇文真虽然是写的二分法,但是二分法依赖有序的数据,所以在使用查找之前先用了一个冒泡排序

package main

import (
    "fmt"
)

// 冒泡排序的函数主体开始
func bubble(arr []float32) {
    times := len(arr)
    for i := 1; i < len(arr); i++ {
        for i := 1; i < times; i++ {
            if arr[i-1] > arr[i] {
                var temp float32
                temp = arr[i-1]
                arr[i-1] = arr[i]
                arr[i] = temp
            }
        }
        times--
    }
}

// 冒泡排序的函数主体结束


// 二分法查找
func dichoto(findarr []float32, findVal float32) string {
    times := 0
    rr := len(findarr)
    Val := 0
    leftIndex := 0
    rightIndex := rr - 1
    middle := (leftIndex + rightIndex) / 2

    for {
        middle = (leftIndex + rightIndex) / 2
        times++
        if leftIndex > rightIndex {
            break
        } else if findarr[middle] > findVal {
            rightIndex = middle - 1
            continue
        } else if findarr[middle] < findVal {
            leftIndex = middle + 1
            continue
        } else {
            Val = middle
            break
        }
    }

    if leftIndex > rightIndex {
        res := fmt.Sprintf("数组没有这个数")
        return res
    }
    res := fmt.Sprintf("找到了下标是%v,用了%v次", Val, times)
    return res

}

func main() {
    // 设置一个切片进行测试
    arr1 := []float32{24, 69, 80, 57, 13}
    bubble(arr1)
    fmt.Println(arr1)

    // 给切片添加新的数字,进一步测试
    arr2 := append(arr1, 45, 97, 86)
    bubble(arr2)
    fmt.Println(arr2)

    var findVal float32
    fmt.Println("已排序完毕,请输入你想超找的数字")
    fmt.Scanln(&findVal)

    res := dichoto(arr2, findVal)
    fmt.Println(res)

}

你可能感兴趣的:(go的二分法查找)