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));
    }
}
目录
相关文章
|
Java Android开发
ACM刷题之路(七)字符串处理 记元培ACM院赛
ACM刷题之路(七)字符串处理 记元培ACM院赛
|
算法 C++
ACM算法训练【快速排序】
ACM算法训练【快速排序】
57 0
ACM算法训练【快速排序】
|
算法
ACM算法训练【归并排序】
ACM算法训练【归并排序】
67 0
ACM算法训练【归并排序】
|
搜索推荐 算法 Java
ACM教程 - 堆排序
ACM教程 - 堆排序
207 0
ACM教程 - 堆排序
|
搜索推荐 算法 Java
ACM教程 - 选择排序
ACM教程 - 选择排序
139 0
ACM教程 - 选择排序
|
搜索推荐 算法 Java
ACM教程 - 插入排序
ACM教程 - 插入排序
140 0
ACM教程 - 插入排序
|
搜索推荐 算法 Java
ACM教程 - 希尔排序
ACM教程 - 希尔排序
196 0
ACM教程 - 希尔排序
|
算法 Python
ACM 选手带你玩转二分查找
ACM 选手带你玩转二分查找
ACM 选手带你玩转二分查找
|
算法 Java Python
ACM 选手图解 LeetCode 多数元素
ACM 选手图解 LeetCode 多数元素
ACM 选手图解 LeetCode 多数元素
|
Java Python
ACM 选手图解 LeetCode 超高频面试题三数之和
ACM 选手图解 LeetCode 超高频面试题三数之和
ACM 选手图解 LeetCode 超高频面试题三数之和