美文网首页
常见排序算法

常见排序算法

作者: 万福来 | 来源:发表于2020-06-02 19:19 被阅读0次

    常用排序算法

    /**
     * 冒泡排序
     */
    func Bubble_sort(arr []int){
        len := len(arr)
        for i:=0;i<len-1;i++{
            for j:=0;j < len - 1 - i;j++{
                if arr[j] < arr[j+1]{
                    temp := arr[j]
                    arr[j] = arr[j+1]
                    arr[j+1] = temp
                }
            }
        }
    }
    /**
     * 选择排序
     */
    func Select_sort(arr []int)  {
        len := len(arr)
        for i:=0;i<len-1;i++{
            for j:= i+1;j<len;j++{
                if arr[i] > arr[j]{
                    temp := arr[i]
                    arr[i] = arr[j]
                    arr[j] = temp
                }
            }
        }
    }
    /**
     * 插入排序
     */
    func Insert_sort(arr []int)  {
        len := len(arr)
        for i:=0;i<len;i++{
            for j:=i; j>0;j--  {
                if arr[j] < arr[j-1] {
                    temp := arr[j]
                    arr[j] = arr[j-1]
                    arr[j-1] = temp
                }
            }
        }
    }
    /**
     * 快速排序分区
     */
    func partition(arr []int ,low,high int) int{
        pivot := arr[low]
        for low < high{
            for low<high && arr[high] > pivot {
                high--
            }
            if low < high {
                arr[low] = arr[high]
                low++
            }
            for low < high && arr[high] <= pivot {
                low++
            }
            if low < high {
                arr[high] = arr[low]
                high--
            }
        }
        arr[low] = pivot
        return low
    }
    /**
     * 快速排序
     */
    func Quick_sort(arr []int,low,high int){
        loc := 0
        if(low <= high){
            loc = partition(arr,low,high)
            Quick_sort(arr,low,loc-1)
            Quick_sort(arr,loc+1,high)
        }
    }
    
    /**
     * 求m的n次方
     */
    func Pow(m, n int) int {
        num := 1
        for i := 1; i <= n; i++ {
            num *= m
        }
        return num
    }
    /**
     *  序列求和 -1,1,-1,1,-1,1,...,(-1)n
     */
    func Sum_1(n int) int {
        sum := 0
        for i := 1; i <= n; i++ {
            p := Pow(-1, i)
            sum += p
        }
        return sum
    }
    /**
     *  序列求和 -1,1,-1,1,-1,1,...,(-1)n
     */
    func Sum_2(n int) int {
        if n%2 == 0 {
            return 0
        } else {
            return -1
        }
    }
    /**
     * 斐波那契数列 算法1, 1,1,2,3,5,8,13,21,34
     */
    func Fib_1(n int) int {
        if n < 1 {
            return 0
        } else if n == 1 || n == 2 {
            return 1
        } else {
            return Fib_1(n-2) + Fib_1(n-1)
        }
    }
    /**
     * 斐波那契数列 算法2
     */
    func Fib_2(n int) int {
        if n < 1 {
            return 0
        }
        arr := make([]int, n+1)
        arr[1] = 1
        arr[2] = 2
        for i := 3; i <= n; i++ {
            arr[i] = arr[i-1] + arr[i-2]
        }
        return arr[n-1]
    }
    /**
     * 斐波那契数列 算法3
     */
    func Fib_3(n int) int {
        if n < 1 {
            return 0
        }
        if n==1 || n ==2 {
            return 1
        }
        s1 := 1
        s2 := 1
        for i := 3; i<= n; i++{
            s2 = s2 + s1
            s1 =  s2 - s1
        }
        return s2
    }
    
    func People_count(){
        x :=0
        y:=0
        z :=0
        for x=1;x<10;x++{
            y = 20-2*x
            z = 30 - x - y
            if (3*x + 2*y + z) == 50{
                fmt.Printf("x=%d,y=%d,z=%d \n",x,y,z)
            }
        }
    }
    
    /**
    * 二分查找算法
     */
    func Binary_search(arr []int,target int)  int{
        len := len(arr)
        if len == 1 && arr[0] == target{
            return 0
        }
        low := 0
        high := len - 1
        for low <= high{
            mid := (low + high) / 2
            if target == arr[mid]{
                return mid
            }else if target < mid{
                high = mid - 1
            }else {
                low = mid + 1
            }
        }
        return -1
    }
    
    /**
    * 求最长公共子串
     */
    func SerachMaxCommString(arr1 ,arr2 []int) []int {
        len1 := len(arr1)
        len2 := len(arr2)
        //利用二维数组记录子问题的LCS长度
        opt := make([][]int,len1,len1)
        for i := 0; i < len1; i++ {
            opt[i] = make([]int, len2)
        }
        for i:=0;i<len1;i++{
            for j:=0;j<len2;j++{
                if arr1[i] == arr2[j] {
                    if i == 0 || j == 0 {
                        opt[i][j] = 1
                    }else {
                        opt[i][j] = opt[i-1][j-1] + 1
                    }
                }else{
                    opt[i][j] = 0
                }
            }
        }
        //找出最大公共长度和坐标
        max := opt[0][0]
        indexi := 0
        indexj := 0
        for i:=0;i<len1;i++{
            for j:=0;j<len2;j++{
                if opt[i][j] > max {
                    max = opt[i][j]
                    indexi = i
                    indexj = j
                }
            }
        }
        fmt.Printf("max lcs = %v \n",max)
        fmt.Printf("max lcs indexi= %v \n",indexi)
        fmt.Printf("max lcs indexj = %v \n",indexj)
        //取短的串返回
        narr := make([]int,max)
        index := 0
        var shortArr []int
        if len1 < len2 {
            index = indexi
            shortArr = arr1
        }else {
            index = indexj
            shortArr = arr2
        }
        fmt.Println(index)
        fmt.Println(shortArr)
        for i:=0;i<max;i++{
            fmt.Println(shortArr[index-max+1+i])
            narr[i] = shortArr[index-max+1+i]
        }
        return narr
    }
    /**
    * 不使用变量反转数组
     */
    func Reversion(arr []int)  []int{
        if(len(arr) < 2){
            return arr
        }
        len := len(arr)
        for i:=0;i<(len/2);i++{
            arr[i] = arr[i] ^ arr[len-i-1]
            arr[len-i-1] = arr[i] ^ arr[len-i-1]
            arr[i] = arr[i] ^ arr[len-i-1]
        }
        return arr
    }
    /**
     * 查找第二大数字
     */
    func FindSecMax(arr []int) int {
        len := len(arr)
        secMax := 0
        max := arr[0]
        for i:=1;i<len;i++{
            if arr[i] > max {
                secMax = max
                max = arr[i]
            }else{
                secMax = arr[i]
            }
        }
        return secMax
    }
    
    unc IpToInt(ip string) (int32, error) {
        ipArr := strings.Split(ip, ".")
        if len(ipArr) != 4 {
            return 0, errors.New("IP is wrong")
        }
        ip1, err1 := strconv.Atoi(ipArr[0])
        ip2, err2 := strconv.Atoi(ipArr[1])
        ip3, err3 := strconv.Atoi(ipArr[2])
        ip4, err4 := strconv.Atoi(ipArr[3])
        if err1 != nil || err2 != nil || err3 != nil || err4 != nil {
            log.Println(err1, err2, err3, err4)
            return 0, errors.New("toint error")
        }
        ipInt := ip1<<24 + ip2<<16 + ip3<<8 + ip4
        return int32(ipInt), nil
    }
    func IntToIp(ip int32) string {
        ip1 := ip >> 24 & 0xFF
        ip2 := ip >> 16 & 0xFF
        ip3 := ip >> 8 & 0xFF
        ip4 := ip & 0xFF
        ips := fmt.Sprintf("%d.%d.%d.%d", ip1, ip2, ip3, ip4)
        return ips
    }
    

    相关文章

      网友评论

          本文标题:常见排序算法

          本文链接:https://www.haomeiwen.com/subject/abspzhtx.html