Golang-排序算法-冒泡排序

  • 1.简介
  • 2.原理
  • 3.操作规则
  • 4.Golang代码
    • 1.升序
    • 2.降序
    • 3.测试
    • 4.完整代码
  • 5.优化
    • 1.原冒泡排序
    • 2.优化后

1.简介

冒泡排序Bubble Sort)是一种较为简单的排序算法,重复的走访要排序的数列,一次比较两个元素,如果顺序错误就交换,走访舒蕾的工作是重复的进行指导没有需要再交换的位置,如同水中的气泡最终上浮到顶端一样。
冒泡排序Bubble Sort)还有一种优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。

2.原理

以升序排序为例

  1. 比较相邻的元素,如果第一个比第二个大,就交换彼此;
  2. 对每一对相邻元素做同样的工作,从开始第一对结尾的最后一对,此时,最后打的元素应该是最大的数; 针对所有元素重复以上步骤,除了最后一个;
  3. 持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较。

3.操作规则

  1. 外层控制行【控制比较次数】
  2. 内层控制列【控制交换次数】
  3. 相邻比大小
  4. 规则交换值

4.Golang代码

1.升序

// 冒泡排序--升序
func BubbleSortAsc(array []int) {// 1.外层控制行[控制比较的次数]:减1的操作,因为是两两相比,所以比较的次数是len-1for i := 0; i < len(array)-1; i++ {// 2.内层控制列[控制交换的次数]:减i的操作,因为随着i的增加,j的上限在减少for j := 0; j < len(array)-1-i; j++ {// 3.相邻比大小if array[j] > array[j+1] {// 4.规则交换值array[j], array[j+1] = array[j+1], array[j]}}}
}

2.降序

// 冒泡排序--降序
func BubbleSortDesc(array []int) {// 1.外层控制行[控制比较的次数]:减1的操作,因为是两两相比,所以比较的次数是len-1for i := 0; i < len(array)-1; i++ {// 2.内层控制列[控制交换的次数]:减i的操作,因为随着i的增加,j的上限在减少for j := 0; j < len(array)-1-i; j++ {// 3.相邻比大小if array[j] < array[j+1] {// 4.规则交换值array[j], array[j+1] = array[j+1], array[j]}}}
}

3.测试

func main() {array := []int{1, 3, 5, 9, 10, 2, 0, 7, 8, 4}fmt.Println("原数据:", array)BubbleSortAsc(array)fmt.Println("冒泡升序:", array)BubbleSortDesc(array)fmt.Println("冒泡降序:", array)
}

4.完整代码

package mainimport ("fmt"
)// 冒泡排序--升序
func BubbleSortAsc(array []int) {// 1.外层控制行[控制比较的次数]:减1的操作,因为是两两相比,所以比较的次数是len-1for i := 0; i < len(array)-1; i++ {// 2.内层控制列[控制交换的次数]:减i的操作,因为随着i的增加,j的上限在减少for j := 0; j < len(array)-1-i; j++ {// 3.相邻比大小if array[j] > array[j+1] {// 4.规则交换值array[j], array[j+1] = array[j+1], array[j]}}}
}// 冒泡排序--降序
func BubbleSortDesc(array []int) {// 1.外层控制行[控制比较的次数]:减1的操作,因为是两两相比,所以比较的次数是len-1for i := 0; i < len(array)-1; i++ {// 2.内层控制列[控制交换的次数]:减i的操作,因为随着i的增加,j的上限在减少for j := 0; j < len(array)-1-i; j++ {// 3.相邻比大小if array[j] < array[j+1] {// 4.规则交换值array[j], array[j+1] = array[j+1], array[j]}}}
}func main() {array := []int{1, 3, 5, 9, 10, 2, 0, 7, 8, 4}fmt.Println("原数据:", array)BubbleSortAsc(array)fmt.Println("冒泡升序:", array)BubbleSortDesc(array)fmt.Println("冒泡降序:", array)
}

5.优化

优化:

  1. 在 某些 数据元素已经有序的情况下,没必要进行操作,提高效率

1.原冒泡排序

操作次数统计count

package mainimport ("fmt"
)// 冒泡排序--升序
func BubbleSortAsc(array []int) {count := 0// 1.外层控制行[控制比较的次数]:减1的操作,因为是两两相比,所以比较的次数是len-1for i := 0; i < len(array)-1; i++ {// 2.内层控制列[控制交换的次数]:减i的操作,因为随着i的增加,j的上限在减少for j := 0; j < len(array)-1-i; j++ {count++// 3.相邻比大小if array[j] > array[j+1] {// 4.规则交换值array[j], array[j+1] = array[j+1], array[j]}}}fmt.Println("冒泡排序升序执行次数:", count)
}// 冒泡排序--降序
func BubbleSortDesc(array []int) {count := 0// 1.外层控制行[控制比较的次数]:减1的操作,因为是两两相比,所以比较的次数是len-1for i := 0; i < len(array)-1; i++ {// 2.内层控制列[控制交换的次数]:减i的操作,因为随着i的增加,j的上限在减少for j := 0; j < len(array)-1-i; j++ {count++// 3.相邻比大小if array[j] < array[j+1] {// 4.规则交换值array[j], array[j+1] = array[j+1], array[j]}}}fmt.Println("冒泡排序降序执行次数:", count)
}func main() {array := []int{1, 3, 5, 9, 10, 2, 0, 7, 8, 4}fmt.Println("原数据:", array)BubbleSortAsc(array)fmt.Println("冒泡升序:", array)BubbleSortDesc(array)fmt.Println("冒泡降序:", array)
}

原数据: [1 3 5 9 10 2 0 7 8 4]
冒泡排序升序执行次数: 45
冒泡升序: [0 1 2 3 4 5 7 8 9 10]
冒泡排序降序执行次数: 45
冒泡降序: [10 9 8 7 5 4 3 2 1 0]

2.优化后

package mainimport ("fmt"
)// 冒泡排序--升序
func BubbleSortAsc(array []int) {// 定义标记,如果已经连续,则不再执行doExec := falsecount := 0// 1.外层控制行[控制比较的次数]:减1的操作,因为是两两相比,所以比较的次数是len-1for i := 0; i < len(array)-1; i++ {// 2.内层控制列[控制交换的次数]:减i的操作,因为随着i的增加,j的上限在减少for j := 0; j < len(array)-1-i; j++ {count++// 3.相邻比大小if array[j] > array[j+1] {// 4.规则交换值array[j], array[j+1] = array[j+1], array[j]// 执行操作,置truedoExec = true}}// 如果没有进行比较交换,则直接退出,不再执行if !doExec {break} else {//如果已经进行比较交换了,那么恢复默认标记,方便后续比较doExec = false}}fmt.Println("冒泡排序升序执行次数:", count)
}// 冒泡排序--降序
func BubbleSortDesc(array []int) {// 定义标记,如果已经连续,则不再执行doExec := falsecount := 0// 1.外层控制行[控制比较的次数]:减1的操作,因为是两两相比,所以比较的次数是len-1for i := 0; i < len(array)-1; i++ {// 2.内层控制列[控制交换的次数]:减i的操作,因为随着i的增加,j的上限在减少for j := 0; j < len(array)-1-i; j++ {count++// 3.相邻比大小if array[j] < array[j+1] {// 4.规则交换值array[j], array[j+1] = array[j+1], array[j]// 执行操作,置truedoExec = true}}// 如果没有进行比较交换,则直接退出,不再执行if !doExec {break} else {//如果已经进行比较交换了,那么恢复默认标记,方便后续比较doExec = false}}fmt.Println("冒泡排序降序执行次数:", count)
}func main() {array := []int{1, 3, 5, 9, 10, 2, 0, 7, 8, 4}fmt.Println("原数据:", array)BubbleSortAsc(array)fmt.Println("冒泡升序:", array)BubbleSortDesc(array)fmt.Println("冒泡降序:", array)
}

原数据: [1 3 5 9 10 2 0 7 8 4]
冒泡排序升序执行次数: 42
冒泡升序: [0 1 2 3 4 5 7 8 9 10]
冒泡排序降序执行次数: 45
冒泡降序: [10 9 8 7 5 4 3 2 1 0]
同样的数据进行排序,执行的次数已经有了明显的优化

Golang(二十一)[排序算法-冒泡排序]相关推荐

  1. python排序算法 ——冒泡排序(附代码)

    python排序算法 --冒泡排序 文章目录 python排序算法 --冒泡排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...

  2. 十大经典排序算法-冒泡排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  3. C语言基础排序算法-冒泡排序

    C语言基础排序算法-冒泡排序 什么是冒泡排序? 顾名思义,这种排序方法就像水中的气泡一样,从底逐渐往上冒,一次前进一步.我们来看一个例子,看看到底是怎么冒泡的.假设有一个数组3,2,5,4,1,我们希 ...

  4. 经典排序算法 - 冒泡排序Bubble sort

    经典排序算法 - 冒泡排序Bubble sort 其原理是比较接近的数字22,按照从小到交换大或降序排列, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头開始进行两两比較交换,直到倒 ...

  5. 排序算法——冒泡排序(Bubble Sort)

    排序算法--冒泡排序(Bubble Sort) 算法简介(Introduction) Bubble sort is to compare adjacent elements of the list a ...

  6. 数据结构--排序算法(冒泡排序)

    一.原理 冒泡排序是最简单的排序算法,两层遍历,外部循环从第一个元素开始遍历到倒数第二个,内部循环从最后一个元素遍历到外部循环的下一个元素,内部循环比较当前元素和前一个位置的元素,如果当前元素大,则交 ...

  7. 冒泡和快速排序的时间复杂度_java 八大排序算法 冒泡排序 快速排序 堆排序 归并排序 等...

    八大排序算法 一.直接插入 1.基本思路 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环 ...

  8. 经典排序算法----冒泡排序算法及其优化(稳定)

    冒泡排序(稳定) 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的:如果两个相等的 ...

  9. 排序算法---冒泡排序(java版)

    冒泡排序 原理 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过依次比较两个相邻的的元素,看两个元素是否满足大小关系要求,如果不满足则交换两个元素.每一次冒泡会让至少一个元素移动到它应该 ...

最新文章

  1. PostgreSQL索引页
  2. python根据地址查看变量名_tensorflow创建变量以及根据名称查找变量
  3. c#语言基础编程-转义符
  4. php pjax数据返回,如何将Pjax整合进网站,实现全站无刷新加载?
  5. mysql 导入百万级数据 几种 java_百万级数据,如何迁移到MySQL?
  6. new image()
  7. Thymeleaf学习总结(1)——新一代Java模板引擎Thymeleaf
  8. yum 查看java版本_如何查找YUM安装的JAVA_HOME环境变量详解
  9. 10001_关于window10下其它主机无法ping通本地的设置
  10. jQuery学习整理 (3) 使用jQuery操作元素的属性与样式
  11. QNX系统和凝思系统分别系统时间设置RTC时间方法
  12. 【ROS】编译软件包packages遇到进度缓慢或卡死,使用swap
  13. Latex学习笔记——字母的变体(正体、花体)
  14. 替罪羊树的原理及实例
  15. DeFi 2.0的LaaS协议Elephant,或许是你熊市下为数不多的获利手段
  16. SSM(spring、springmvc、mybatis)框架搭建
  17. 车间制造管理系统(下)
  18. 极品特效HTML5动画推荐,不看的程序员后悔一辈子
  19. 0范数,1范数,2范数
  20. 学习笔记——STM32C8T6如何配置普通IO口

热门文章

  1. 计算机 英语统考多少分及格,计算机技术在职研究生同等学力申硕全国统考英语多少分算合格...
  2. 计算机学院教师老带新总结,教师老带新工作总结
  3. 扩散模型:Diffusion models as plug-and-play priors作为即插即用先验的扩散模型
  4. CAD 利用代码加载cui文件
  5. 打包压缩RAC oracle软件目录后重装OS,解压后目录权限变化
  6. 异步加载 yepnope.js
  7. 10分钟HTML5入门基础知识(二)
  8. linux ip地址文件夹,linux设置IP地址
  9. 橡皮筋画直线c 语言,canvas——橡皮筋式线条绘图应用
  10. UE5 受击方位提示功能