写在前面

排序算法种类繁多,根据处理的数据规模与存储特点,可分为内部排序外部排序:前者处理的数据规模不大,内存足以容纳;后者处理的数据规模较大,必须将数据存放于外部存储器中,每次排序的时候需要访问外存。

根据输入的不同形式,分为脱机算法在线算法:前者待排序的数据是一次性给出的;而在云计算之类的环境中,待排序的数据是实时生成的,在排序算法开始运行时,数据并未完全就绪,而是随着排序算法本身的进行而逐步给出的。

另外,针对不同的体系结构,又分为串行并行两大类排序算法。根据算法是否采用随机策略,还有确定式和随机式之分。

排序算法需要关注比较次数交换次数这2个复杂度。


一、冒泡排序的原理

冒泡排序算法(英语:Bubble Sort)的原理如下:

  1. 从后往前依次比较相邻的元素。若是要按照升序排序,则后面的比前面的小,就交换这2个元素;降序则相反。
  2. 对每一对相邻元素作同样的工作,从第一对到最后一对。一轮比较交换下来,最后的元素就会是最小(或最大)的数了,这个数就不用参与后面的比较操作了。
  3. 针对所有的元素重复以上的步骤。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

二、C++代码实现

2.1 基础版本

基础版完全按照上面的冒泡排序的原理来实现。主要点在于2次循环的作用,以及循环的开始和结束。

重点关注代码中的注释部分

// 功能:实现对int数组按升序排序
// 参数:
//   data: int数组
//      n: 数组元素的个数
// 返回值:
//   无
//
void BubbleSort_v1(int data[], int n) {int compare_times = 0; // 仅用于统计进行了多少次比较操作,与算法实现无关。int swap_times = 0;    // 仅用于统计进行了多少次交换操作,与算法实现无关。// 第一层循环表示需要冒多少个泡上来,n个数冒n-1个泡之后,顺序就确定下来了//for (int i = 0; i < n - 1; i++) { // 第二层循环表示每个泡怎么冒,从后往前依次和相邻的元素两两比较//for (int j = n - 1; j > i; j--) {compare_times++;if (data[j] < data[j - 1]) {swap_times++;// data[j - 1]和data[j]交换//int temp = data[j];data[j] = data[j - 1];data[j - 1] = temp;}}}printf("比较:%d次,交换:%d次.\n", compare_times, swap_times);
}

2.2 带标记版本

基础版本针对已经有序的数组(如int a[] = {1,2,3,4,5,6}),仍然要进行完整的比较操作(虽然没有进行任何地数据交换),因为基础版本没有检测已有数据是否已经按照指定的顺序排列好了的功能。我们可以加入一个标记,如果一趟循环下来,一次交换操作都没有发生,则说明剩下的数据都已经按照指定的顺序排列好了,排序操作可以结束了。

// 功能:实现对int数组按升序排序
// 参数:
//   data: int数组
//      n: 数组元素的个数
// 返回值:
//   无
//
void BubbleSort_v2(int data[], int n) {int compare_times = 0; // 仅用于统计进行了多少次比较操作,与算法实现无关。int swap_times = 0;    // 仅用于统计进行了多少次交换操作,与算法实现无关。// 标记一个泡冒上来时,是否进行了交换操作。// 若一个泡冒上来,一次交换操作都没做,则说明剩下的元素都已经按照指定顺序(升序或降序)排好了。//bool has_swap = false; // 第一层循环表示需要冒多少个泡上来,n个数冒n-1个泡之后,顺序就确定下来了//for (int i = 0; i < n - 1; i++) {has_swap = false;// 第二层循环表示每个泡怎么冒,从后往前依次和相邻的元素两两比较//for (int j = n - 1; j > i; j--) {compare_times++;if (data[j] < data[j - 1]) {// data[j - 1]和data[j]交换//int temp = data[j];data[j] = data[j - 1];data[j - 1] = temp;swap_times++;has_swap = true;}}// 一次交换操作都没做,则说明剩下的元素都已经按照指定顺序(升序或降序)排好了,结束排序操作。if (has_swap == false) {break;}}printf("比较:%d次,交换:%d次.\n", compare_times, swap_times);
}

常用算法简述 -- 冒泡排序相关推荐

  1. java常用算法之冒泡排序简单例子

    为了更好的理解冒泡排序过程,下面举一个实例. 初始数组 118 101 105 127 112 一次排序 101 118 105 112 127 二次排序 101 105 118 112 127 三次 ...

  2. 游戏常用算法:冒泡排序

    基本概念 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个 ...

  3. 常用算法简述 -- 插入排序

    一.插入排序的原理 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实 ...

  4. KKB:数组常用算法、冒泡排序(重点内容)

    数组概述 数组是相同数据类型的多个数据的容器 这些数据都是线性排列的 查找最大/最小值 冒泡排序 相邻的两个数据进行比较,小的放左边,大的放右边. 那么经过一轮的比较之后,最大值一定在最右边 如果有n ...

  5. golang 排序_常用排序算法之冒泡排序

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

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

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

  7. c++ 单例模式_Java面试题总结之设计模式、网络基础、常用算法

    一.设计模式 1.单例模式 A.懒汉式 单例模式最简单的实现发现,但是不支持多线程,线程不安全 如果想线程安全,在方法上加上synchronized就可以,不过这样效率低下,99%情况都不会用到 pu ...

  8. JavaScript数据结构和算法简述——数组

    为什么先讲数组 数据结构可以简单的被分为线性结构和非线性结构. 线性结构大致包括: 数组(连续存储): 链表(离散存储): 栈(线性结构常见应用,由链表或数组增删和改进功能实现): 队列(线性结构常见 ...

  9. C/C++程序基础 (九)排序算法简述

    排序算法 算法复杂度 算法简述 插入排序 N2 前方有序,依次将后方无序数据插入前方合适位置. 冒泡排序 N2 前方有序,从后方两两比较,将最小泡冒到前方. 选择排序 N2 前方有序,从后方选择最小的 ...

最新文章

  1. 抽象:程序员必备的能力
  2. 你有没有觉得邮件发送人固定配置在yml文件中是不妥当的呢?SpringBoot 动态设置邮件发送人
  3. 机器人实现屠宰自动化
  4. 信息学奥赛一本通 2025:【例4.11】体操队
  5. bzoj2756 [SCOI2012]奇怪的游戏 结论+网络流
  6. [转载] Python input()函数
  7. java环境变量配置验证_怎么验证Java环境变量配置成功
  8. PeakDo毫米波无线投屏器
  9. MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/...
  10. MySQL讲义第 48 讲——select 查询之查询练习(六)
  11. 苹果蓝牙耳机怎么接电话_除了苹果AirPods,真无线蓝牙耳机到底怎么选?
  12. RabbitMQ的交换机类型和工作模式
  13. Hibernate主键生成策略总结
  14. android midi字节,MIDI的20个基本概念
  15. 苹果mac电脑怎么设置默认浏览器
  16. python简笔画大全_只用C++和Python,让你的简笔画实时动起来!
  17. openEuler 知:repo
  18. spring:setter注入构造器注入注解注入
  19. Mozilla FireFox Gecko内核源代码解析(4.nsHTMLTokens)
  20. #地图故事#教程2:如何制作分级颜色地图

热门文章

  1. 8年美团经验之谈 —— 自动化测试成长之路
  2. 300英雄11月服务器维护,300英雄11月7日6:00-9:00全区停机更新公告
  3. 触漫显示服务器正在升级怎么办,谁说自拍不直出?旷视科技携手联想Z5s用AI微整形让你一键变靓...
  4. 报错:IndexError: too many indices for array
  5. 题目12: 寻找最佳装载快递的货车
  6. 使用百度EasyDL实现明厨亮灶厨师帽识别
  7. RabbitMQ——入门介绍
  8. pci和pci-e的区别有哪些?
  9. Android Accessibility自动安装app
  10. ESP32 通过Web图形控件调节PWM占空比输出