【摘要】 bubble sort的是最基本的算法,被誉为永远会被考从来不被用的算法,基本原则是大数右移,每轮遍历后最右侧的数是最大的,所以下一轮循环时可不予考虑,时间复杂度为O(n^2)。

一.冒泡排序

bubble sort的是最基本的算法,被誉为永远会被考从来不被用的算法,基本原则是大数右移,每轮遍历后最右侧的数是最大的,所以下一轮循环时可不予考虑,时间复杂度为O(n^2)。

function bubbleSort(arr) {    let length = arr.length;    for(let i = length - 1; i > 1; i--){        for(let j = 0; j < i ;j++){            if (arr[j] > arr[j+1]) {swap(arr, j, j+1);}}}
}function swap(arr, a, b) {    let temp;temp = arr[a];arr[a] = arr[b];arr[b] = temp;
}

二.选择排序

selection sort的基本原则是把数放在对的位置上,外层遍历依次指向每个位置,内层遍历从剩余的元素中寻找最小值放在该位置,时间复杂度O(n^2)。

/*** 选择排序示例代码*/function selectionSort(arr) {    let length = arr.length;    for(let pos = 0 ; pos < length ; pos++){        let tempMin = pos;//用于记录当前内层循环找到的最小值的下标for(let j = pos+1 ; j < length ;j++){            if (arr[j] < arr[tempMin]) {tempMin = j;}}swap(arr, pos, tempMin);}
}function swap(arr, a, b) {    let temp;temp = arr[a];arr[a] = arr[b];arr[b] = temp;
}

三.插入排序

insertion sort的基本原则是小数左移,即每轮循环结束后,外层循环指向位置左侧的片段都是已经完成排序的,时间复杂度也为O(n^2)。

/*** 插入排序示例代码*/function insertionSort(arr) {    let length = arr.length;    for(let pos = 1 ; pos < length ; pos++){        for(let j = pos ; j > 0 ; j--){            if (arr[j] < arr[j-1]) {swap(arr, j, j-1);}}}
}function swap(arr, a, b) {    let temp;temp = arr[a];arr[a] = arr[b];arr[b] = temp;
}

四. 一些需要注意的点

1.运行时间

时间复杂度仅仅代表算法本身随计算规模的增长时其自身运算量的增长速度,是一种抽象数学符号表达,并不代表程序的运行时间,在程序中对比测试3种算法时,其运行时间可能出现较大差异,这并不影响其在算法分析层面的时间复杂度定义。

2.基本优化

基于时间复杂度与程序运行效率并不绝对一致这样的前提,上面的三种基本算法在不改变算法思想的前提下仍然存在优化空间,例如基础插入排序中,内层循环所做的工作可以描述为为当前元素在左侧已排序列中找到正确的位置,换句话说,找到正确位置之前,通过swap( )方法交换相邻元素的位置的动作是可以不必执行的。

当针对更大的问题规模时,从基本算法出发,融入其他诸如“分治”,“减治”的思想,就可以得到更高级的算法,时间复杂度也更低。

3. 如何区分三种基础排序算法

对于三种基本排序算法还不是很清楚的读者,可以自行搜索“图解算法”相关的博文进行查看,这三种算法的时间复杂度是一样的(都是两层循环),只需要区分其主要排序思想的原则差异,并不难记忆。

  • 冒泡排序——大数右移

  • 选择排序——按位入坑

  • 选择排序——小数左移

来源:华为云社区  作者:大史不说话

野生前端的数据结构练习(9)冒泡排序,选择排序,插入排序相关推荐

  1. 十大经典排序算法详解(一)冒泡排序,选择排序,插入排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 目录 1.算法的评判标准 2.排序算法的分类 3.十大经典排序算法-冒泡排序,选择排序,插入排序 ...

  2. 冒泡排序选择排序插入排序

    目录 冒泡排序 选择排序 插入排序 冒泡排序 冒泡排序(最好是O(n), 最坏O(n2)) 原理: 拿自己与上面一个比较,如果上面一个比自己小就将自己和上面一个调换位置,依次再与上面一个比较,第一轮结 ...

  3. 【排序算法】冒泡排序|选择排序|插入排序|希尔排序

    文章目录 冒泡排序 选择排序 插入排序 希尔排序 冒泡排序   第一个元素开始向第二个元素比较,若大于则交换位置,不大于则不动.然后第二个元素和第三个元素比较,再然后第三个元素和第四个元素比较-一直比 ...

  4. c语言数组项目按身高排序,过三关 Java冒泡排序选择排序插入排序小练习

    材料:猴子排序,按照身高来从小到大来排序. 第一关: 老猴子带领小猴子队伍按大小逐一比较,交换,开始高矮排列队伍.(冒泡排序) 第二关: 太慢了,给第一关增加难度,进行选择排序 第三关: 最后,尝试选 ...

  5. 02_Python算法+数据结构笔记-冒泡排序-选择排序-插入排序-快排-二叉树

    b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili 文章目录 #11 排序介绍 #12 冒泡排序介绍 #13 冒泡排序 #14 选择排序 #15 插入 ...

  6. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  7. java冒泡排序函数验证_java冒泡排序-选择排序-插入排序-使用API中文文档直接调用函数...

    import java.util.Arrays; public class ArrayDemo2_3 { public static void main(String []args) { //---- ...

  8. 过三关 Java冒泡排序选择排序插入排序小练习

    材料:猴子排序,按照身高来从小到大来排序. 第一关: 老猴子带领小猴子队伍按大小逐一比较,交换,开始高矮排列队伍.(冒泡排序) 第二关: 太慢了,给第一关增加难度,进行选择排序 第三关: 最后,尝试选 ...

  9. 【排序算法】冒泡排序 选择排序 插入排序 希尔排序(数组)

    冒泡排序 #include<iostream> using namespace std; #define SWAP(a,b) {int tmp;tmp=a;a=b;b=tmp;} int ...

  10. java 冒泡排序 选择排序 插入排序及其异同点

    交换两坐标位置的swap()函数 之后要用到 public static void swap(int[] arr, int a, int b) {int temp;temp = arr[a];arr[ ...

最新文章

  1. ListT随机返回一个
  2. 国际顶级学界业界大咖云集,9 场技术论坛布道,2019 嵌入式智能国际大会强势来袭!...
  3. ASP.NET Razor – C# 逻辑条件简介
  4. 百度最早量产?一图看全球公司无人驾驶汽车时间表
  5. 共享可写节包含重定位_PE结构学习01-DOS头-NT头-节表头
  6. keras 模型量化
  7. 采用CreateThread()创建多线程程序
  8. 视频私有云实战:基于Docker构建点播私有云平台
  9. CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)
  10. mysql导入dat文件_MySql导入和抽取大数量级文件数据
  11. css设置按钮竖直方向居中_如何借助伪元素实现垂直居中?
  12. 界面发布2019中国最富1000人榜:凛冬望春,马云问鼎中国首富
  13. 【JVM系列】一步步解析java执行内幕,java初级面试笔试题
  14. 如何解除服务器注册,《天龙八部手游》服务器注册上限怎么办 服务器注册方法...
  15. SpringMVC中@RequestMapping参数设置
  16. 【面试】基于二叉树层次遍历相关问题的求解
  17. Origin 2017去除水印的方法
  18. python deap_DEAP(Distributed Evolutionary Algorithms in Python)1.2.2文档(一)
  19. 工具类批量修改照片的名字
  20. navigationController.navigationBar 设置背景透明

热门文章

  1. python脚本自动运行失败_Linux中定时任务执行python脚本失败的解决方法
  2. vscode比较整个文件夹_vscode开发ROS1(5)-ROS工程目录结构
  3. delphi控件切图界面闪烁_DirectUI用户手册.pdf
  4. SIAMATIC S7-1200 中通过 Modbus RTU 如何读取地址范围 9999 到 65535 的输入字
  5. IntelliJ IDEA 2017新工具
  6. 进程间通讯-3(Manager)-实现数据的同时修改
  7. 关于数据库记录排序问题
  8. C++中的4种类型转换方式
  9. bzoj 1500 [NOI 2005] 维修数列
  10. 安装memcache