Go语言:冒泡排序 及其 三种优化方法

2019-10-09  本文已影响0人  白祤星

代码实例(未优化):


package main

import "fmt"

func main() {
    // 打乱的数据源
    arr := []int{3, 6, 4, 2, 11, 10, 5}

    // 冒泡排序
    arr = bubbleSort(arr)

    // 输出数据
    fmt.Println(arr)
}

// 冒泡排序
func bubbleSort(arr []int) []int {
    len := len(arr)
    for i := 0; i < len-1; i++ {
        for j := 0; j < len-1; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }
        }
    }
    return arr
}

代码实例(优化一):


// 冒泡排序
func bubbleSort(arr []int) []int {
    len := len(arr)
    flag := false
    for i := 0; i < len-1; i++ {
        flag = true
        for j := 0; j < len-1; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
                flag = false
            }
        }
        if flag {
            return arr
        }
    }
    return arr
}

代码实例(优化二):


// 冒泡排序
func bubbleSort(arr []int) []int {
    len := len(arr)
    flag := false
    for i := 0; i < len-1; i++ {
        flag = true
        for j := 0; j < len-1-i; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
                flag = false
            }
        }
        if flag {
            return arr
        }
    }
    return arr
}

代码实例(优化三):


// 冒泡排序
func bubbleSort(arr []int) []int {
    len := len(arr)
    l_borden := 0       // 左边界初始值
    r_borden := len - 1 // 右边界初始值
    l_pos := 0          // 记录左边界的值
    r_pos := 0          // 记录右边界的值
    flag := false
    for i := 0; i < len-1; i++ {
        flag = true
        // 正向找出最大值
        for j := l_borden; j < r_borden; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
                flag = false
                r_pos = j
            }
        }
        if flag {
            return arr
        }
        // 逆向找出最小值
        for j := r_borden; j > l_borden; j-- {
            if arr[j] < arr[j-1] {
                arr[j], arr[j-1] = arr[j-1], arr[j]
                flag = false
                l_pos = j
            }
        }
        if flag {
            return arr
        }
        r_borden = r_pos
        l_borden = l_pos
    }
    return arr
}
上一篇下一篇

猜你喜欢

热点阅读