一. 实现原理

冒泡排序的相关知识,参考冒泡排序 程序员小灰

二. 具体实现

1. 初始版本

void BubbleSort_Init(int* pData, int size)
{if (nullptr == pData || size <= 0) return;for (int i = 0; i < size - 1; ++i) // 轮数为size - 1{for (int j = 0; j < size - 1 - i; ++j) // 注意j的上限为size-1-i, 确保j+1不越界{if (pData[j] > pData[j+1]) std::swap(pData[j], pData[j+1]);}}
}

每一轮结束之后,如果这轮中没有进行一次数据交换,表明数组已经有序,无需再进行操作。

2. 改进版本

void BubbleSort_Advance(int* pData, int size)
{if (nullptr == pData || size <= 0) return;for (int i = 0; i < size - 1; ++i) // 轮数为size - 1{bool hasSwap = false; // 是否有过数据交换for (int j = 0; j < size - 1 - i; ++j) // 注意j的上限为size-1-i, 确保j+1不越界{if (pData[j] > pData[j + 1]){std::swap(pData[j], pData[j + 1]);hasSwap = true;}}if (!hasSwap) break; // 这一轮没有一次交换,说明已经排好序,无需再比较}
}

如果每轮中,只有前面进行过数据交换,后面没有。可以以最后交换过数据的位置作为下一次进行检查的终点。

3. 最终版本

void BubbleSort_Final(int* pData, int size)
{if (nullptr == pData || size <= 0) return;int endIdx = size - 1; // 每次比较的结束位置,从这个位置(包括)之后已经有序int lastSwapIdx = 0; // 每轮中最后交换的位置for (int i = 0; i < size - 1; ++i) // 轮数为size - 1{bool hasSwap = false;for (int j = 0; j < endIdx; ++j) // 注意j的上限为size-1-i, 确保j+1不越界{if (pData[j] > pData[j + 1]){std::swap(pData[j], pData[j + 1]);hasSwap = true; lastSwapIdx = j;  // 更新需要比较的最终位置}}// 这一轮没有一次交换,说明已经排好序,无需再比较if (!hasSwap) break;endIdx = lastSwapIdx;}
}

三. 输出验证

加上相关的输出信息后再进行调用。

辅助函数:

void Print(int* pData, int size)
{for (int idx = 0; idx < size; ++idx) std::cout << pData[idx] << " ";std::cout << std::endl;
}

初始数据为:

int datas[10] = { 1, 2, 3, 2, 1, 6 };

1. 初始版本

void BubbleSort_Init_Output(int* pData, int size)
{if (nullptr == pData || size <= 0) return;for (int i = 0; i < size - 1; ++i) // 轮数为size - 1{std::cout << std::endl << "ROUND " << i << std::endl << std::endl;for (int j = 0; j < size - 1 - i; ++j) // 注意j的上限为size-1-i, 确保j+1不越界{if (pData[j] > pData[j+1])std::swap(pData[j], pData[j+1]);std::cout << "STEP " << j << ":" << std::endl;Print(pData, size);}}
}

调用输出

ROUND 0STEP 0:
1 2 3 2 1 6
STEP 1:
1 2 3 2 1 6
STEP 2:
1 2 2 3 1 6
STEP 3:
1 2 2 1 3 6
STEP 4:
1 2 2 1 3 6ROUND 1STEP 0:
1 2 2 1 3 6
STEP 1:
1 2 2 1 3 6
STEP 2:
1 2 1 2 3 6
STEP 3:
1 2 1 2 3 6ROUND 2STEP 0:
1 2 1 2 3 6
STEP 1:
1 1 2 2 3 6
STEP 2:
1 1 2 2 3 6ROUND 3STEP 0:
1 1 2 2 3 6
STEP 1:
1 1 2 2 3 6ROUND 4STEP 0:
1 1 2 2 3 6

2. 改进版本

void BubbleSort_Advance_Output(int* pData, int size)
{if (nullptr == pData || size <= 0) return;for (int i = 0; i < size - 1; ++i) // 轮数为size - 1{bool hasSwap = false;std::cout << std::endl << "ROUND " << i << std::endl << std::endl;for (int j = 0; j < size - 1 - i; ++j) // 注意j的上限为size-1-i, 确保j+1不越界{if (pData[j] > pData[j + 1]){std::swap(pData[j], pData[j + 1]);hasSwap = true;}std::cout << "STEP " << j << ":" << std::endl;Print(pData, size);}// 这一轮没有一次交换,说明已经排好序,无需再比较if (!hasSwap) break;}
}

调用输出

ROUND 0STEP 0:
1 2 3 2 1 6
STEP 1:
1 2 3 2 1 6
STEP 2:
1 2 2 3 1 6
STEP 3:
1 2 2 1 3 6
STEP 4:
1 2 2 1 3 6ROUND 1STEP 0:
1 2 2 1 3 6
STEP 1:
1 2 2 1 3 6
STEP 2:
1 2 1 2 3 6
STEP 3:
1 2 1 2 3 6ROUND 2STEP 0:
1 2 1 2 3 6
STEP 1:
1 1 2 2 3 6
STEP 2:
1 1 2 2 3 6ROUND 3STEP 0:
1 1 2 2 3 6
STEP 1:
1 1 2 2 3 6

3. 最终版本

void BubbleSort_Final_Output(int* pData, int size)
{if (nullptr == pData || size <= 0) return;int endIdx = size - 1; // 每次比较的结束位置,从这个位置(包括)之后已经有序int lastSwapIdx = 0; // 每轮中最后交换的位置for (int i = 0; i < size - 1; ++i) // 轮数为size - 1{bool hasSwap = false;std::cout << std::endl << "ROUND " << i << std::endl << std::endl;for (int j = 0; j < endIdx; ++j) // 注意j的上限为size-1-i, 确保j+1不越界{if (pData[j] > pData[j + 1]){std::swap(pData[j], pData[j + 1]);hasSwap = true;       lastSwapIdx = j;  // 更新需要比较的最终位置}std::cout << "STEP " << j << ":" << std::endl;Print(pData, size);}// 这一轮没有一次交换,说明已经排好序,无需  再比较if (!hasSwap) break;endIdx = lastSwapIdx;}
}

调用输出


ROUND 0STEP 0:
1 2 3 2 1 6
STEP 1:
1 2 3 2 1 6
STEP 2:
1 2 2 3 1 6
STEP 3:
1 2 2 1 3 6
STEP 4:
1 2 2 1 3 6ROUND 1STEP 0:
1 2 2 1 3 6
STEP 1:
1 2 2 1 3 6
STEP 2:
1 2 1 2 3 6ROUND 2STEP 0:
1 2 1 2 3 6
STEP 1:
1 1 2 2 3 6ROUND 3STEP 0:
1 1 2 2 3 6

排序算法之一 冒泡排序(C++版本)相关推荐

  1. 十种经典排序算法精粹(c语言版本)

    下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...

  2. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  3. 插入排序算法 java_排序算法实现-插入排序(Java版本)

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

  4. Java排序算法:冒泡排序

    Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...

  5. 排序算法:冒泡排序、插入排序、选择排序、希尔排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...

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

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

  7. 十大经典排序算法1(Python版本)

    文章目录 一.排序算法与时间复杂度 二.冒泡排序 一.排序算法与时间复杂度 1.十大排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次 ...

  8. 数据结构与算法:十大排序算法之冒泡排序

    数据结构与算法:十大排序算法之冒泡排序 package array;import java.util.Arrays;//冒泡排序 //1.比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换 ...

  9. 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析

    [排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...

  10. 排序算法(1)冒泡排序

    排序算法(1)冒泡排序 原理: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3. ...

最新文章

  1. Java多态性Polymorphic
  2. java combinationsum_Leecode39 combination-sum
  3. 崛起的超级智能:是否会是下一个“麦克卢汉式”预言?
  4. java 项目使用 ajaxfileupload
  5. C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记09--构造方法/析构方法/继承/多态/封装...
  6. Python 爬虫利器 Beautiful Soup 4 之文档树的搜索
  7. P6015-[CSGRound3]游戏【树状数组】
  8. 如何给视频中插入视频,字幕,以及去掉前后广告
  9. 为多孔介质的当量直径_多孔介质流建模简介
  10. java基础代码实例_java学习之web基础(3):Servlet 和 Request的登录处理实例
  11. rac部署过程的任务列表
  12. [推荐]WebService开发知识介绍
  13. 图片保存为YUV格式
  14. Java 学生选课系统 源代码
  15. 中华黑豹计算机病毒,关于中华黑豹病毒...-爱毒霸交流论坛
  16. 华为 任正非 2021年1月22日 最新内部电邮全文
  17. 互联网+双“高新”时代
  18. html掷骰子游戏的代码,jquery实现掷骰子小游戏
  19. Python 去除字符串中空格(删除指定字符)的3种方法
  20. while ... Wend循环语句的用法

热门文章

  1. Weex小册—从0搭建一个Weex项目
  2. 2T以上的盘怎么分区, 利用parted创建 linuxTB硬盘GPT分区
  3. CHIL-ORACLE-创建视图
  4. 老上网本不能上无线网
  5. 酒桌遭遇劝酒莫惊慌 挡酒有词咱见招拆招(ZT)
  6. 1.性能之巅 洞悉系统、企业与云计算 --- 绪论
  7. 5.分布式服务架构:原理、设计与实战 --- 基于调用链的服务治理系统的设计与实现
  8. 5.这就是搜索引擎:核心技术详解 --- 检索模型与搜索排序
  9. 6. ubuntu 下 mysql 数据库迁移
  10. 6. PHP 正则表达式