美文网首页
Go语言:冒泡排序 及其 三种优化方法

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

作者: 白祤星 | 来源:发表于2019-10-09 07:29 被阅读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
}

代码实例(优化二):


  • 第一次外循环会把最大值交换到最后一个位置
  • 第二次外循环会把次大的值交换到倒数第二位
  • 以此类推,随着一次次的循环,后面的部分都已经是有序的了
  • 那么,靠后部分就不必在进行比较(即:每次内循环的次数 -1 = 减去外循环的当前次数)
// 冒泡排序
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
}

相关文章

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

    代码实例(未优化): 代码实例(优化一): 在全部数据中,前面数比后面数大,就会发生交换,把大的数换到后面去 因此...

  • C语言中排序方法的使用

    C语言中排序方法 学习目的 今天我们学习了三种排序方法:冒泡排序法、选择排序法、插入排序法。 相关技术,及其实用 ...

  • Java Go python 运行速度对比

    Java Go python 运行速度对比 系统环境 测试方法 选用常用的冒泡排序分别使用三种语言进行1亿次排序,...

  • 冒泡排序(Go版本)

    本篇文章是在<>基础之上进行的优化。上面文章的代码: 1、代码优化 利用go语言中函数特性,可以...

  • go语言把随机数冒泡排序

    go语言把随机数冒泡排序 output

  • 冒泡与选择排序

    优化版冒泡排序 选择排序 数据交换常用三种算法对比

  • 排序--冒泡排序及其优化

    版权声明:本文源自简书tianma,转载请务必注明出处:http://www.jianshu.com/p/ad84...

  • 冒泡排序及其优化

    定义:每一趟依次比较相邻的两个数,将小数放在前面,大数放在后面,直到一趟只剩下一个元素。 名字的由来:因为越小的元...

  • 冒泡排序及其优化

    冒泡排序原理:通过交换相邻元素,来将未排序中最大(小)元素依次“冒泡”到数组最后方。最原始的冒泡排序: 从代码中我...

  • 冒泡排序的C语言实现

    冒泡排序 优化后的冒泡排序

网友评论

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

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