BubbleSort
     冒泡排序是许多人接触的第一种排序方式,由于这种方式比较简单,所以大部分人也没有深入研究,所以写出的代码是这样的:
void BubbleSort(int *arr, int len)
{assert(arr);int i = 0;int j = 0;int tmp = 0;for (i = 0; i < len - 1; i++){for (j = 0; j < len -i- 1; j++)       //每排序一趟,则必然后面有一个已经有序,可以减少循环缩小排序的范围{if (arr[j]>arr[j + 1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
其实我想告诉你的是冒泡排序还有三种优化方式:(以下都是以升序为例)
例如要排序下面这组数据: 1   2   3   4   5   6   7   8   10  9
    按照上面的排序方式,第一趟将10 与 9交换后已经就有序了,所以接下来的8趟都是多余的。这时我们可以加一个标记来判断每一趟排序时是否交换过数据,如果哪一趟排序没有交换数据,则这时就已经有序了。
void BubbleSort(int *arr, int len)
{assert(arr);int i = 0;int j = 0;int flag = 0;int tmp = 0;for (i = 0; i < len - 1; i++){flag = 1;                              //flag初始时为1for (j = 0; j < len - i - 1; j++)       //每排序一趟,则必然后面有一个已经有序,可以缩小排序的范围{if (arr[j]>arr[j + 1])             //只要要交换数据,则flag就会被修改{tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;                    //只要这组数还未完全有序,则一定会修改flag为0}}if (flag)                             //如果排序一趟,发现已经有序,则不进入if,flag没被修改{break;}}
}
 这样修改之后虽然提高了冒泡排序的效率,但是还是不是最理想的!!!
例如现在要排序下面这组数据:1  2  5  7  4   3   6   8  9  10
根据上面的算法我们可以写出如下代码:
void BubbleSort(int *arr, int len)
{assert(arr);int i = 0;int j = 0;int flag = 0;int tmp = 0;int m = 0;                  //用来记录最后一次交换的位置int k = len-1;for (i = 0; i < len - 1; i++){m = 0;flag = 1;for (j = 0; j < k; j++)       //无序区的范围只从第一个元素,到上一趟最后一次交换的位置k{if (arr[j]>arr[j + 1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;                    //只要这组数还未完全有序,则一定会修改flag为0m = j;}}if (flag)                             //如果排序一趟,发现已经有序,则不进入if,flag没被修改{break;}k = m;                             //将k置成最后一次交换的位置}
}
写成上面这种方式 ,冒泡排序的效率已经得到了极大的提升,下面我们再来介绍第三种优化的方法!!!
    对下面这组这组数进行排序:2  3  4  5  6  7  8  9  10  1
根据上面的算法,我们可以写出如下代码:
void BubbleSort(int *arr, int len)
{assert(arr);int i = 0;int j = 0;int flag = 0;int m = 0;       //记录最后一次交换的位置int n = 0;int k = len - 1;for (i = 0; i < len - 1; i++){m = 0;flag = 1;//正序扫描找最大值for (j = n; j < k; j++)       //无序区的范围只从第一个元素,到上一趟最后一次交换的位置k{if (arr[j]>arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;                    //只要这组数还未完全有序,则一定会修改flag为0m = j;}}k = m;if (flag)                    //如果排序一趟,发现已经有序,则不进入if,flag没被修改{break;}//反序扫描找最小值for (j = k; j>n; j--)       //无序区的范围只从第一个元素,到上一趟最后一次交换的位置k{if (arr[j]<arr[j - 1]){int tmp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = tmp;flag = 0;                    //只要这组数还未完全有序,则一定会修改flag为0}}n++;if (flag)                    //如果排序一趟,发现已经有序,则不进入if,flag没被修改{break;}                           //将k置成最后一次交换的位置}
}
这种改进之后的冒泡排序是不是很厉害!!!   ^v^

排序--Bubble的三种优化相关推荐

  1. C语言快速排序算法及三种优化方式

    C语言快速排序算法及三种优化方式 C语言快速排序算法及三种优化方式 原理 快速排序复杂度分析 1 时间复杂度 2 空间复杂度 快速排序代码实现 1 普通快速排序 2 快速排序优化1-三数取中优化不必要 ...

  2. 机器学习萌新必备的三种优化算法 | 选型指南

    作者 | Nasir Hemed 编译 | Rachel 出品 | AI科技大本营(id:rgznai100) [导读]在本文中,作者对常用的三种机器学习优化算法(牛顿法.梯度下降法.最速下降法)进行 ...

  3. 快排的三种优化方式。

    对于快排而言,其核心在partition中,主要是对于pivot的选取上,所以我们可以按以下三种方案进行优化: 1.在数组长度大于某一个阈值范围时,我们进行递归快排,当数据长度小于阈值时,我们进行插入 ...

  4. Java学生成绩排序输出的三种不同方法

    要实现学生成绩的排序,要从两方面来考虑如何设计程序. 第一方面是选择存储方式 第二方面是选择什么样的排序方式 以下是三种不同类型的实现: 使用对象数组存储学生信息,冒泡法实现排序 使用List存储学生 ...

  5. 鲁棒最小二乘法的三种优化形式(CVX)

    文章目录 数据初始部分 (a) robust least-squares problem (b)least-squares problem with variable weights (c)quadr ...

  6. 数学建模matlab 优化模型,数学建模实验中三种优化模型的分析

    1. 引言 在20世纪中期,数学建模 [1] 就在欧美国度首次被发现,而在中国的呈现稍晚些,但是大约在80年代初始咱们国家也就有了.它的核心即是创立数学模型 [2] ,使得问题获得最优化的解决.而数学 ...

  7. 关于排序不等式的三种证法

    排序不等式的原理很容易理解,即"大乘大与小乘小之和,大于大小搭配乘". 其证明过程也较为简单,下面给出三种证法.前两种为初等证法,第三种使用了阿贝尔变换的结论,证明起来更简洁明了.

  8. 1D/1D动态规划的三种优化方法

    1D/1D1D/1D1D/1D动态规划 形如dp[i]=min{dp[j]+w(j,i)}(Li≤j≤Ri)dp[i]=min\{dp[j]+w(j,i)\} (L_i\leq j\leq R_i)d ...

  9. html z-dext优先级顺序,$ext{1D/1D}$ 动态规划的三种优化

    神必博主的沙雕前言 参考文献: 概念明晰 所谓 (ext{1D/1D}) 动态规划, 指的是状态数和单状态决策数都是 (O(n)) 的动态规划方程, 暴力求解的时间复杂度为 (O(n^2)). 四边形 ...

最新文章

  1. 到底选择PostgreSOL还是MySQL?看这里!
  2. java major version: 51,Unsupported major.minor version 51.0的原因与解决办法
  3. XV6850成功刷机步骤
  4. 架构之:微服务架构漫谈
  5. 时间序列研(part8)--ADF检验
  6. Codeforces Round #245 (Div. 1) E. Points and Segments 欧拉回路 + 建模
  7. Sword pcre库函数学习三
  8. java中的linearnumexpr,java - Cplex中的上限和下限等于0.0(在cplex中) - 堆栈内存溢出...
  9. 微信计算机配置高速缓冲器,电脑中设置固态硬盘SSD为高速缓存器的方法
  10. 基于神经网络的房价预测,房价预测 神经网络
  11. 学校邮箱的pop服务器地,常用邮箱的POP与SMTP服务器
  12. 全国三级城市联动 js版
  13. 网站服务器需不需要装杀毒软件,服务器要不要装杀毒软件
  14. C语言解决猴子分桃问题的代码
  15. 测试用例是开发人员最后一块遮羞布
  16. Tableau实战 Tableau官网各版块访问情况(四)各网址情况分析
  17. android字体大小根据分辨率自动调整
  18. 软文营销如何自我激励创造巨大价值
  19. 利用NI模拟量输出板卡LabVIEW输出正弦波形的方法
  20. windows系统修复 | 使用 System File Checker (SFC) scannow 命令修复问题

热门文章

  1. VMware 虚拟网卡防火墙问题
  2. mfc vs2010 C++ 连接mysql等数据库
  3. odbc sqlstate:IM004
  4. Python中匿名函数详解
  5. 斐波那契数列(循环)
  6. 关于pycharm找不到已经安装的模块问题的解决方案module ImportError
  7. 宗镜录略讲——南怀瑾老师——系列11
  8. 支付宝原型设计-低保真Axure9支付宝界面设计
  9. 影视剪辑,自学剪辑,如何提高剪辑的思维
  10. 主机名以及内外部命令