介绍:

  冒泡排序是一种最基础的交换排序(两两比较待排序的关键字,交换不满足次序要求的那对数,直到整个表都满足次序要求为止),工作方式如同碳酸饮料中的二氧化碳气泡最终会上浮到顶端一样,故名"冒泡排序"。

算法描述:

  一次比较相邻的数据,将小数据放在前(假设非递减排列),大数据放在后。即第一趟比较第n个和第n-1个数,小数在前,大数在后,再比较第n-1个数与第n-2个数,小数在前,大数在后,以此类推比较第1个和第0个数,小数在前,大数在后;第一趟后最小元素已放在正确位置,以此类推,直到全部元素放在正确的位置。

性能分析:

  时间复杂度:O(N^2)

  空间复杂度:O(1)

  稳定性:稳定

代码实现:

// Java代码
class BubbleSort {
public static void bubbleSort(int[] a) {
// i表示这一趟要填入正确元素的位置,最后一个位置不需要比较
// 因为n-1个元素在正确位置,最后一个位置自然填入正确元素
for (int i = 0; i < a.length - 1; ++i) {
// 从后往前依次比较,将最小元素"冒泡"到最前方,要填入正确元素的位置i
for (int j = a.length - 1; j > i; --j) {
if (a[j] < a[j - 1]) {// 交换不满足次序要求的元素
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
}
}
// C++代码
class BubbleSort {
public:
static void bubbleSort(int a[], int length) {
// i表示这一趟要填入正确元素的位置,最后一个位置不需要比较
// 因为n-1个元素在正确位置,最后一个位置自然填入正确元素
for (int i = 0; i < length - 1; ++i) {
// 从后往前依次比较,将最小元素"冒泡"到最前方,要填入正确元素的位置i
for (int j = length - 1; j > i; --j) {
if (a[j] < a[j - 1]) {// 交换不满足次序要求的元素
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
}
};

算法优化:

  考虑一些特殊情况,比如:

    (1)待排序序列已经有序,整个代码任然会执行无效的遍历和比较。

    (2)数据已经排好序,但任然会进行下一轮比较,直到length-1次,后面的比较都是无意义的。

  可以通过设置标志位flag,如果发生了交换就改变flag设置为true,如果没有交换就保持false。当一轮比较结束后如果flag仍为false,即:这一轮没有发生交换,说明数据的顺序已经排好,没有必要继续进行下去。退出循环,排序完成。

// Java代码
class BubbleSort {
public static void bubbleSort2(int[] a) {
boolean flag = false;// 标记第i趟是否发生元素交换
// i表示这一趟要填入正确元素的位置,最后一个位置不需要比较
// 因为n-1个元素在正确位置,最后一个位置自然填入正确元素
for (int i = 0; i < a.length - 1; ++i) {
flag = false;// 每趟默认未进行元素交换
// 从后往前依次比较,将最小元素"冒泡"到最前方,要填入正确元素的位置i
for (int j = a.length - 1; j > i; --j) {
if (a[j] < a[j - 1]) {// 交换不满足次序要求的元素
flag = true;// 发生元素交换,改变flag
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
if (flag == false) {// 未发生交换,序列满足要求,完成排序
break;// 跳出循环
}
}
}
}
// C++代码
class BubbleSort {
public:
static void bubbleSort2(int a[], int length) {
bool flag = false;// 标记第i趟是否发生元素交换
// i表示这一趟要填入正确元素的位置,最后一个位置不需要比较
// 因为n-1个元素在正确位置,最后一个位置自然填入正确元素
for (int i = 0; i < length - 1; ++i) {
flag = false;// 每趟默认未进行元素交换
// 从后往前依次比较,将最小元素"冒泡"到最前方,要填入正确元素的位置i
for (int j = length - 1; j > i; --j) {
if (a[j] < a[j - 1]) {// 交换不满足次序要求的元素
flag = true;// 发生元素交换,改变flag
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
if (flag == false) {// 未发生交换,序列满足要求,完成排序
break;// 跳出循环
}
}
}
};

冒泡排序(BubbleSort)的更多相关文章

  1. 排序算法SIX:冒泡排序BubbleSort

    /** *冒泡排序: * 两个两个比较,一轮过后最大的排在了最后面 * n个数变为n-1个没排好的数 * 再进行一轮 * 第二大的排在了倒数第二个 * 以此类推 * 直到排到第一个为止 * * 弄两个 ...

  2. 冒泡排序BubbleSort

    /** * * @author Administrator * 功能:交换式排序之冒泡排序 */ package com.test1; import java.util.Calendar; publi ...

  3. 排序之冒泡排序(bubblesort)

    package com.pailian; /* * 冒泡排序 * 比较相邻的俩位数,这样每轮比较都会出现一个最大值或最小值 * 下一轮比较就会减少一次(因为已经知道了一个最大值或最小值) * 注意根据 ...

  4. javascript版快速排序和冒泡排序

    var sort = (function () { //快速排序 var quickSort = { partition: function (array, low, high) { if (low ...

  5. 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort

    Swap的简单实现 //C语言方式(by-pointer): template <typename Type> bool swapByPointer(Type *pointer1, Typ ...

  6. 排序方法整理Java - 冒泡排序、选择排序、插入排序、快速排序

    /** * 排序方法整理 * @author zhyea * */ public class Sort { /** * 冒泡排序,从小到大. * 冒泡排序是比较相邻的两个元素,若顺序错误,则执行交换. ...

  7. 排序系列 之 冒泡排序及其改进算法 —— Java实现

    冒泡排序算法 冒泡排序算法 改进一 冒泡排序算法 改进二 冒泡排序算法 改进三 冒泡排序算法 基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上而下对相邻的两个数依次进行比较和调 ...

  8. BubbleSort

    看见了一些乱乱的东西,就想着整理一下,基础的冒泡排序 //BubbleSort #include<iostream> using namespace std; void BubbleSor ...

  9. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

随机推荐

  1. 如何重置电信悦 me 智能网关

    如何重置电信悦 me 智能网关 重置电信网关密码 电信悦 me 智能网关密码忘记了怎么办? 首先,得要知道默认终端配置地址和默认终端配置密码. 可以从无线路由器背面标签得知. 如果不知道密码了,可以通 ...

  2. local JSON file loader in js

    local JSON file loader in js "use strict"; /** * * @author xgqfrms * @license MIT * @copyr ...

  3. Dva & Umi

    Dva & Umi Dva.js & Umi.js React & Redux https://dvajs.com/ React and redux based, lightw ...

  4. React & redux-saga & effects & Generator function & React Hooks

    React & redux-saga & effects & Generator function & React Hooks demos https://github ...

  5. HTML5 & custom element & template

    HTML5 & custom element & template template https://codepen.io/xgqfrms/pen/eYYExvp https://cs ...

  6. 「NGK每日快讯」2021.1.7日NGK第65期官方快讯!

  7. NGK DeFi Baccarat或将推动BGV成为下一个千倍币!

    目前,已经接近2020年年末,但是DeFi的热潮还在持续.近日,DeFi市场传出一道重磅利好消息,便是NGK DeFi去中心化交易系统Baccarat即将上线.届时,将会引起整个区块链市场的又一次震动 ...

  8. java自学第3期——继承、多态、接口、抽象类、final关键字、权限修饰符、内部类

    一.继承: 关键字extends /* 定义一个父类:人类 定义父类格式:public class 父类名称{ } 定义子类格式:public class 子类名称 extends 父类名称{ } * ...

  9. Spring IoC总结

    Spring 复习 1.Spring IoC 1.1 基本概念 1.1.1 DIP(Dependency Inversion Principle) 字面意思依赖反转原则,即调用某个类的构造器创建对象时 ...

  10. virtualbox-centos扩容

    virtualbox-centos扩容 版本信息 virtualbox:版本 6.1.4 r136177 (Qt5.6.2) centos:CentOS Linux release 7.7.1908 ...