排序问题是编程中最常见的问题。实际应用中,计算机有接近一半时间是在处理有关数据排列的问题,提高排序的效率有助于更快地解决问题。

先来说说平常一般的冒泡算法,使用两个循环,外循环作为整体排序,每趟循环使未排序元素中的最大(小)值归位(到达其最终位置)。内循环用于两两相邻元素比较。每次对一组n个数据进行排序时都要进行n-1次全体扫描交换。比如对5,1,2,3,4进行升序排列,进行一趟整体扫描后变为1,2,3,4,5,实际已经达到要求可以输出,可是还要进行3次整体扫描排序,比较繁琐。

这里提供的算法可以解决上述普通算法效率比较低的问题。核心思想是这样的:

1.定义一个布尔变量sorted作为判断是否整体排序的标志,初始化其为false。

2.每趟排序判断 !sorted 的值为1才进行整体扫描,进入循环。

3.进入循环,先把sorted赋值为ture,对两两相邻元素进行比较,若发现有元素不符合顺序,操作使元素换位并将sorted赋值为false,若比较完这一趟未发现有元素乱序,则sorted保持为true,然后n--。

由此,借助布尔变量sorted,可及时提前退出,而不致于总是蛮力地做n - 1趟扫描交换。 如对5,1,2,3,4升序排列操作,进行2趟扫描后即可输出,若用普通冒泡则需4趟扫描。

下面是冒泡排序的实现代码。

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. void swap(int &a, int &b) {
  5. int c;
  6. c = a;
  7. a = b;
  8. b = c;
  9. }
  10.  
  11. void booblesort(int a[], int n) {
  12. bool sorted = false;
  13. while (!sorted) {
  14. sorted = true;
  15. for (int i = ; i < n - ; i++) {
  16. if (a[i] > a[i + ]) {
  17. swap(a[i], a[i + ]);
  18. sorted = false;
  19. }
  20. }
  21. n--;
  22. }
  23. }
  24.  
  25. int main() {
  26. cout << "please enter ten integers:" << endl;
  27. int a[];
  28. for (int i = ; i < ; i++) {
  29. cin >> a[i];
  30. }
  31. booblesort(a, );
  32. for (int i = ; i < ; i++) {
  33. cout << a[i] << " ";
  34. }
  35. cout << endl;
  36. return ;
  37. }

参考资料:《数据结构(C++语言版)》(第3版)—— 邓俊辉

借助bool判断使冒泡排序效率提高的更多相关文章

  1. guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁

    guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...

  2. JS 冒泡排序从学到优化

    目的:理解算法 深化算法 冒泡排序: 直接上动图好于文字 一个冒泡实例 45,67,23,88,21,6,99// 第一轮 6次// 45 67 23 88 21 6 99// 45 23 67 88 ...

  3. Python学习笔记5-字符串、bool、数值操作和数组字典排序

    1.字符串 # 字符串数字之间转换 # x = int("6") # print type(x) #<type 'str'> # y = str(6) # print ...

  4. Swift - 判断应用是否是第一次启动(或当前版本是否第一次启动)

    1 实现原理 (1)我们会发现许多 App 在一次启动时会显示一个新手引导页(下次启动就不会再显示)   (2)其判断原理就是在 AppDelegate 里的 didFinishLaunchingWi ...

  5. c语言字符串比较与bool型

    c++字符串string,定义的变量,能够通过比较符号,直接进行比较. 而c语言则不能通过char数组定义的变量,来直接比较.应用下面的方法: #include <string.h> in ...

  6. 不可不表的OSG智能指针之强指针与弱指针 《转载》

    不可不表的OSG智能指针之强指针与弱指针 <转载> 使用OSG的人都知道OSG的内存管理方式采用了智能指针,通过智能指针的方式让OSG自己处理对象的销毁工作.在OSG中有两个智能指针类型, ...

  7. [PHP] 2018年终总结

    去掉敏感信息后的不完整版 ==========================================================================2018年12月29日 记 ...

  8. Siki_Unity_2-9_C#高级教程(未完)

    Unity 2-9 C#高级教程 任务1:字符串和正则表达式任务1-1&1-2:字符串类string System.String类(string为别名) 注:string创建的字符串是不可变的 ...

  9. Go语言基础之15--文件基本操作

    一.文件读写 1.1 os.File os.File封装所有文件相关操作, 是一个自定义的struct. a. 打开一个文件进行读操作: os.Open(name string) (*File, er ...

随机推荐

  1. 【原创】Linux 增加系统调用

    Linux 增加系统调用大致步骤: 1.下载好内核文件,在内核源文件中添加好自己的调用函数. 2.编译内核 3.验证. 一.在内核源文件中增加自己的函数   首先将内核文件移至/usr/src/下并解 ...

  2. SQL 添加字段和默认值脚本

    --插入字段和默认值alter table Acc_WayBill add DeclaredValue nvarchar(50)goEXEC sys.sp_addextendedproperty @n ...

  3. DevExpress 控件使用之BarManager

    DevExpress 开发的控件有很强的实力,不仅功能丰富,应用简便,而且界面华丽,更可方便定制.对于编程人员来说是个不错的选择.它的菜单栏控件更具代表,完全可以替代开发环境提供的基本控件,而让您编写 ...

  4. 如何用angularjs制作一个完整的表格之三__在ng-repeat中使用ng-model

    在ng-repeat中使用ng-model时会有许多问,有的人碰到无法获取绑定的数据内容,有的人遇到改动绑定的数据内容时所有循环生成的内容一起改变.上面的问题我在开发时也遇到过,但是解决后我却怎么也还 ...

  5. postgresql info

    DROP TYPE IF EXISTS info CASCADE;CREATE TYPE info AS (state int4,operator varchar,time TIMESTAMP(0) ...

  6. Mysql修改设置root密码的命令及方法

    方法一:使用SQL语句命令UPDATE 需用到Mysql自带的加密函数PASSWORD(string),该函数对一个明文密码进行加密,但不能解密.专门用于mysql.user(用户权限表)中设置密码, ...

  7. 一些嵌入式和FPGA相关模块的开源

    工作一年,整理下手头做过的东西,分享出来,希望能帮到大家. 嵌入式方面,主要集中在Xilinx家的器件上,ZYNQ居多.Linux相关的就不贴了,网上的资料太多,xilinx-wiki上资料都是比较全 ...

  8. Apache httpd.conf的翻译

    本人初学,15年暑假翻译了一些,前几天翻译完,有机器翻译,也有自己翻译的内容,不准确之处请指出. --------------------------------------------------- ...

  9. [原博客] POJ 2505 A multiplication game 组合游戏

    题目链接题意: 有一个数p=1,甲乙两人轮流操作,每次可以把p乘2~9中的一个数,给定一个n,当一个人操作后p>=n,那么这个人赢,问先手是否必胜. 必胜状态:存在一种走法走到一个必败状态. 必 ...

  10. hdu 4714

    一个树形dp的题,又是一个涉及不深的领域  = =: 不过在网上看到了大神用很巧的思路解决了这个题: 大神的思路就是: 从树的底部往上看:如果一棵子树拥有两个及以上的叶子节点,可以将这棵子树与大树分离 ...