ACM教程 - 冒泡排序

简介: ACM教程 - 冒泡排序

定义

选择排序是一种简单直观的排序算法,其基本原理是每一次从待排序的数组里找到最小值(最大值)的下标,然后将最小值(最大值)跟待排序数组第一个进行交换,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。反复的进行这样的过程直到待排序的数组全部有序。

  • 稳定性:根据 相等元素 在数组中的 相对顺序 是否被改变,排序算法可分为「稳定排序」和「非稳定排序」两类。
  • 就地性:根据排序过程中 是否使用额外内存(辅助数组),排序算法可分为「原地排序」和「异地排序」两类。一般地,由于不使用外部内存,原地排序相比非原地排序的执行效率更高。
  • 自适应性:根据算法 时间复杂度 是否 受待排序数组的元素分布影响 ,排序算法可分为「自适应排序」和「非自适应排序」两类。「自适应排序」的时间复杂度受元素分布影响,反之不受其影响。
  • 比较类:比较类排序基于元素之间的 比较算子(小于、相等、大于)来决定元素的相对顺序;相对的,非比较排序则不基于比较算子实现。

图解a6fee72b7dee48088a7c14e5c42f336c.gif

image.png

性质

  • 时间复杂度
  • 最佳 O(n)
  • 通过增加一个标志位 flag ,若某轮内循环未执行任何交换操作时,说明已经完成排序,因此直接返回。此优化使冒泡排序的最优时间复杂度达到 O(n)(当输入数组已排序时)

image.png

  • 空间复杂度
  • 最差 O(1)
  • 稳定性:稳定
  • 就地性:原地
  • 自适应性:自适应
  • 比较类:比较

Java

publicclassbubbleSort {
publicstaticvoidmain(String[] args) {
int[] num= {10, 7, 5, 3, 2};
for (inti=1; i<num.length; i++) { // i可以为0, 但是数组的第一个数字没必要要和自己比较, 所以令i=1booleanflag=false; // 初始化标志位for (intj=0; j<num.length-i; j++) { // 要注意是否会超出数组长度, 后面还有num[j+1]// 比大小进行交换if (num[j] >num[j+1]) {
inttemp=num[j+1];
num[j+1] =num[j];
num[j] =temp;
flag=true; // 记录交换元素                }
            }
if (!flag) break; // 内循环未交换任何元素,则跳出        }
// 输出结果: [2, 3, 5, 7, 10]System.out.println(Arrays.toString(num));
    }
}
目录
相关文章
|
4月前
|
安全 数据库 Windows
技术笔记:Sharepoint学习笔记—习题系列
技术笔记:Sharepoint学习笔记—习题系列
|
5月前
|
存储 机器学习/深度学习 算法
|
5月前
|
算法 搜索推荐 C语言
【408数据结构与算法】—冒泡排序(十八)
【408数据结构与算法】—冒泡排序(十八)
[课后习题]C Primer Plus【第六版】编程练习 第二章习题参考答案
[课后习题]C Primer Plus【第六版】编程练习 第二章习题参考答案
[课后习题]C Primer Plus【第六版】编程练习 第三章习题 参考答案
[课后习题]C Primer Plus【第六版】编程练习 第三章习题 参考答案
[课后习题]C Primer Plus【第六版】编程练习 第一章
[课后习题]C Primer Plus【第六版】编程练习 第一章
算法导论(第三版)具体算法解析与理解
算法导论(第三版)具体算法解析与理解
|
算法 搜索推荐 文件存储
零基础VB教程021期:冒泡排序算法精讲
零基础VB教程021期:冒泡排序算法精讲
|
机器学习/深度学习 存储 人工智能
AcWing算法基础课笔记 第一章 基础算法
​编辑快速排序算法模板 —— 模板题 AcWing 785. 快速排序 归并排序算法模板 —— 模板题 AcWing 787. 归并排序 整数二分算法模板 —— 模板题 AcWing 789. 数的范围 浮点数二分算法模板 —— 模板题 AcWing 790. 数的三次方根 高精度加法 —— 模板题 AcWing 791. 高精度加法 高精度减法 —— 模板题 AcWing 792. 高精度减法 高精度乘低精度 —— 模板题 AcWing 793. 高精度乘法 高精度除以低精度 —— 模板题 AcWing 794. 高精度除法 一维前缀和 —— 模板题 AcWing 795.
304 0
|
移动开发 算法 C++
数据结构与算法之图的应用
一.树之习题选讲-Tree Traversals Again 树习题-TTA.1 题意理解 非递归中序遍历的过程 ● 1. Push的顺序为先序遍历(pre) ● 2. Pop的顺序给出中序遍历(in) ● 树习题-TTA.2 核心算法 上图分别是先序、中序、后序遍历通过规律我们可以看到他们之间的位置分配 //伪代码 void solve(int preL,int inL,int n) { if(n == 0) return;//n等于0的时候什么都不做(n真的会右等于0的时候吗?为什么写他?)调用完了 之后右边没有元素,此时n等于0,进行判断正常结束进程 if(n == 1){p
85 0