周末无事,带娃之余看到娃娃在算数,想到了排序~尝试着把几种常用的排序算法跟大家聊一聊,在分析的后面我会用GoLang、PHP和JS三种语言来实现下。

常见的基于选择的排序算法有冒泡排序、插入排序、选择排序、归并排序和快速排序。选择排序算法通常会根据以下几个纬度来考虑:

  • 时间复杂度
  • 空间复杂度
  • 算法的稳定性(待排序序列中有值相等的元素,经过排序之后相等元素之间原有的顺序不变)

时间复杂度和空间复杂度

时间复杂度表示代码执行时间随数据规模增长的变化趋势

几种常见的复杂度量级如下:

空间复杂度表示算法的存储空间与数据规模之间的增长关系

冒泡排序算法

冒泡排序只会操作相邻的两个数据。每次操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。

通过一个例子给大家看下冒泡的过程。我们要对一组数据 4,5,6,3,2,1,从小到到大进行排序,第一次排序的过程如下:

经过 n 次冒泡,所有元素都在自己应该的位置上,如下图:

Go示例:

package main// a是数组,n是数组长度func BubbleSort(a []int, n int) {    if n <= 1 {        return    }    for i := 0; i < n; i++ {        flag := false        for j := 0; j  a[j+1] {                a[j], a[j+1] = a[j+1], a[j]                flag = true            }        }        if !flag {            break        }    }}

PHP示例:

function bubbleSort($arr) {      if (count($arr) <= 1) {            return $arr;      }      for ($i =  0; $i < count($arr); $i++) {            $flag = false;            for($j = 0; $j < count($arr) - $i - 1; $j++) {            i    f ($arr[$j] > $arr[$j + 1]) {                $temp = $arr[$j];                $arr[$j] = $arr[$j + 1];                $arr[$j + 1] = $temp;                $flag = true;            }        }        if (!$flag) {            break;        }    }    return $arr;}

性能分析

最后我们看下冒泡排序的性能和稳定性:

  1. 时间复杂度:O(n2)
  2. 空间复杂度:只交换相邻元素,只需要常量级的临时空间,是原地排序算法
  3. 算法稳定性:相等元素不会交换顺序,是稳定的排序算法

golang 排序_常用排序算法之冒泡排序相关推荐

  1. 冒泡和快速排序的时间复杂度_常用排序算法之冒泡排序

    周末无事,带娃之余看到娃娃在算数,想到了排序-尝试着把几种常用的排序算法跟大家聊一聊,在分析的后面我会用GoLang.PHP和JS三种语言来实现下. 常见的基于选择的排序算法有冒泡排序.插入排序.选择 ...

  2. 选择排序算法流程图_常用排序算法之选择排序

    前两天给大家分享了冒泡排序和插入排序(没关注的同学,可以关注后查看历史消息),今天继续给大家分享另一种常用的排序算法--选择排序. 选择排序 选择排序和插入排序很相似,也区分已排序区间和未排序区间,选 ...

  3. 折半查找的思想及源码_常用排序与查找算法

    1 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中 ...

  4. js数组按中文拼音排序_学习排序算法,结合这个方法太容易理解了

    排序是一个经典的问题,它以一定的顺序对一个数组或列表中的元素进行重新排序.而排序算法也是各有千秋,每个都有自身的优点和局限性.虽然这些算法平常根本就不用自己去编写,但作为一个有追求的程序员,还是要了解 ...

  5. java 性能 排序_Java常用排序算法及性能测试集合

    package algorithm.sort; import java.lang.reflect.Method; import java.util.Arrays; import java.util.D ...

  6. 二分法排序_二分法排序算法

    #includeintfun(inta[],intn,intkey){intlow,mid,high;//low.mid.high是三个索引分别指向数组的下标low=0;//low指向数组a[]的第一 ...

  7. python经典排序_经典排序 python实现

    稳定的排序算法:冒泡排序.插入排序.归并排序和基数排序.不是稳定的排序算法:选择排序.快速排序.希尔排序.堆排序. 冒泡 defbobble(arr): length=len(arr)for i in ...

  8. python链表排序_链表排序+末尾各种排序

    #工具人排序 def nums_sort(data): if not data: return [] min_data = min(data) max_data = max(data) nums =  ...

  9. java二分法排序_二分法排序讲解『附视频』

    二分法排序讲解『附视频』 时间:2017-06-22     来源:华清远见JAVA学院 算法一直是Java编程学习中的重点和难点,今天华清Java学院小编就和大家分享一下Java中的二分法排序. ① ...

最新文章

  1. 程序员到了35 岁就要被裁员?
  2. 常用的生物学数据库及网站介绍,你都了解了吗?
  3. 安装vue-cli时报错
  4. WCF必知必会以及与Webapi的区别
  5. 数据:以太坊上借贷协议资金规模年内增长幅度超300%
  6. JavaScript学习之Object(下)this
  7. android nfc读写demo,android nfc常用标签读取总结
  8. 微信小程序 # 仿写微信通讯录页面(字母侧栏效果)
  9. 软件测试基础知识【纯知识分享】
  10. Linux学习笔记精华总结(选自鸟哥的Linux私房菜)
  11. 一文详解IBM SPSS Modeler 18.0安装教程
  12. Thunderbird – 开源免费跨平台邮箱客户端
  13. zabbix使用SNMP监控思科无线控制器WLC
  14. unity占用太多c盘空间
  15. 微信蓝牙设备服务器,微信又更新了 支持连接蓝牙设备
  16. Android仿腾讯手机管家实现桌面悬浮窗小火箭发射的动画效果
  17. TWAIN和WIA之间有什么相似/不同之处?
  18. 上海 集体户口转个人户口
  19. Python把mp4视频转化成gif动图
  20. 爬虫系列---scrapy post请求、框架组件和下载中间件+boss直聘爬取

热门文章

  1. 盖茨为什么会要求对机器人收税?
  2. Datatables参数详解
  3. Codeforces数据结构(水题)小结
  4. 当一个变量只能通过引用传递的时候。
  5. Saltstack SLS文件解读
  6. Win7(包括32和64位)使用GitHub
  7. c语言创建树,递归创建二叉树c语言实现+详细解释
  8. 数论 —— 欧拉函数
  9. 装箱问题(洛谷-P1049)
  10. 牛的旅行(信息学奥赛一本通-T1343)