排序算法之一 冒泡排序(C++版本)
一. 实现原理
冒泡排序的相关知识,参考冒泡排序 程序员小灰
二. 具体实现
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++版本)相关推荐
- 十种经典排序算法精粹(c语言版本)
下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...
- 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...
- 插入排序算法 java_排序算法实现-插入排序(Java版本)
原标题:排序算法实现-插入排序(Java版本) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到 ...
- Java排序算法:冒泡排序
Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...
- 排序算法:冒泡排序、插入排序、选择排序、希尔排序
相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...
- golang 排序_常用排序算法之冒泡排序
周末无事,带娃之余看到娃娃在算数,想到了排序-尝试着把几种常用的排序算法跟大家聊一聊,在分析的后面我会用GoLang.PHP和JS三种语言来实现下. 常见的基于选择的排序算法有冒泡排序.插入排序.选择 ...
- 十大经典排序算法1(Python版本)
文章目录 一.排序算法与时间复杂度 二.冒泡排序 一.排序算法与时间复杂度 1.十大排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次 ...
- 数据结构与算法:十大排序算法之冒泡排序
数据结构与算法:十大排序算法之冒泡排序 package array;import java.util.Arrays;//冒泡排序 //1.比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换 ...
- 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析
[排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...
- 排序算法(1)冒泡排序
排序算法(1)冒泡排序 原理: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3. ...
最新文章
- Java多态性Polymorphic
- java combinationsum_Leecode39 combination-sum
- 崛起的超级智能:是否会是下一个“麦克卢汉式”预言?
- java 项目使用 ajaxfileupload
- C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记09--构造方法/析构方法/继承/多态/封装...
- Python 爬虫利器 Beautiful Soup 4 之文档树的搜索
- P6015-[CSGRound3]游戏【树状数组】
- 如何给视频中插入视频,字幕,以及去掉前后广告
- 为多孔介质的当量直径_多孔介质流建模简介
- java基础代码实例_java学习之web基础(3):Servlet 和 Request的登录处理实例
- rac部署过程的任务列表
- [推荐]WebService开发知识介绍
- 图片保存为YUV格式
- Java 学生选课系统 源代码
- 中华黑豹计算机病毒,关于中华黑豹病毒...-爱毒霸交流论坛
- 华为 任正非 2021年1月22日 最新内部电邮全文
- 互联网+双“高新”时代
- html掷骰子游戏的代码,jquery实现掷骰子小游戏
- Python 去除字符串中空格(删除指定字符)的3种方法
- while ... Wend循环语句的用法