借助bool判断使冒泡排序效率提高
排序问题是编程中最常见的问题。实际应用中,计算机有接近一半时间是在处理有关数据排列的问题,提高排序的效率有助于更快地解决问题。
先来说说平常一般的冒泡算法,使用两个循环,外循环作为整体排序,每趟循环使未排序元素中的最大(小)值归位(到达其最终位置)。内循环用于两两相邻元素比较。每次对一组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趟扫描。
下面是冒泡排序的实现代码。
- #include<iostream>
- using namespace std;
- void swap(int &a, int &b) {
- int c;
- c = a;
- a = b;
- b = c;
- }
- void booblesort(int a[], int n) {
- bool sorted = false;
- while (!sorted) {
- sorted = true;
- for (int i = ; i < n - ; i++) {
- if (a[i] > a[i + ]) {
- swap(a[i], a[i + ]);
- sorted = false;
- }
- }
- n--;
- }
- }
- int main() {
- cout << "please enter ten integers:" << endl;
- int a[];
- for (int i = ; i < ; i++) {
- cin >> a[i];
- }
- booblesort(a, );
- for (int i = ; i < ; i++) {
- cout << a[i] << " ";
- }
- cout << endl;
- return ;
- }
参考资料:《数据结构(C++语言版)》(第3版)—— 邓俊辉
借助bool判断使冒泡排序效率提高的更多相关文章
- guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...
- JS 冒泡排序从学到优化
目的:理解算法 深化算法 冒泡排序: 直接上动图好于文字 一个冒泡实例 45,67,23,88,21,6,99// 第一轮 6次// 45 67 23 88 21 6 99// 45 23 67 88 ...
- Python学习笔记5-字符串、bool、数值操作和数组字典排序
1.字符串 # 字符串数字之间转换 # x = int("6") # print type(x) #<type 'str'> # y = str(6) # print ...
- Swift - 判断应用是否是第一次启动(或当前版本是否第一次启动)
1 实现原理 (1)我们会发现许多 App 在一次启动时会显示一个新手引导页(下次启动就不会再显示) (2)其判断原理就是在 AppDelegate 里的 didFinishLaunchingWi ...
- c语言字符串比较与bool型
c++字符串string,定义的变量,能够通过比较符号,直接进行比较. 而c语言则不能通过char数组定义的变量,来直接比较.应用下面的方法: #include <string.h> in ...
- 不可不表的OSG智能指针之强指针与弱指针 《转载》
不可不表的OSG智能指针之强指针与弱指针 <转载> 使用OSG的人都知道OSG的内存管理方式采用了智能指针,通过智能指针的方式让OSG自己处理对象的销毁工作.在OSG中有两个智能指针类型, ...
- [PHP] 2018年终总结
去掉敏感信息后的不完整版 ==========================================================================2018年12月29日 记 ...
- Siki_Unity_2-9_C#高级教程(未完)
Unity 2-9 C#高级教程 任务1:字符串和正则表达式任务1-1&1-2:字符串类string System.String类(string为别名) 注:string创建的字符串是不可变的 ...
- Go语言基础之15--文件基本操作
一.文件读写 1.1 os.File os.File封装所有文件相关操作, 是一个自定义的struct. a. 打开一个文件进行读操作: os.Open(name string) (*File, er ...
随机推荐
- 【原创】Linux 增加系统调用
Linux 增加系统调用大致步骤: 1.下载好内核文件,在内核源文件中添加好自己的调用函数. 2.编译内核 3.验证. 一.在内核源文件中增加自己的函数 首先将内核文件移至/usr/src/下并解 ...
- SQL 添加字段和默认值脚本
--插入字段和默认值alter table Acc_WayBill add DeclaredValue nvarchar(50)goEXEC sys.sp_addextendedproperty @n ...
- DevExpress 控件使用之BarManager
DevExpress 开发的控件有很强的实力,不仅功能丰富,应用简便,而且界面华丽,更可方便定制.对于编程人员来说是个不错的选择.它的菜单栏控件更具代表,完全可以替代开发环境提供的基本控件,而让您编写 ...
- 如何用angularjs制作一个完整的表格之三__在ng-repeat中使用ng-model
在ng-repeat中使用ng-model时会有许多问,有的人碰到无法获取绑定的数据内容,有的人遇到改动绑定的数据内容时所有循环生成的内容一起改变.上面的问题我在开发时也遇到过,但是解决后我却怎么也还 ...
- postgresql info
DROP TYPE IF EXISTS info CASCADE;CREATE TYPE info AS (state int4,operator varchar,time TIMESTAMP(0) ...
- Mysql修改设置root密码的命令及方法
方法一:使用SQL语句命令UPDATE 需用到Mysql自带的加密函数PASSWORD(string),该函数对一个明文密码进行加密,但不能解密.专门用于mysql.user(用户权限表)中设置密码, ...
- 一些嵌入式和FPGA相关模块的开源
工作一年,整理下手头做过的东西,分享出来,希望能帮到大家. 嵌入式方面,主要集中在Xilinx家的器件上,ZYNQ居多.Linux相关的就不贴了,网上的资料太多,xilinx-wiki上资料都是比较全 ...
- Apache httpd.conf的翻译
本人初学,15年暑假翻译了一些,前几天翻译完,有机器翻译,也有自己翻译的内容,不准确之处请指出. --------------------------------------------------- ...
- [原博客] POJ 2505 A multiplication game 组合游戏
题目链接题意: 有一个数p=1,甲乙两人轮流操作,每次可以把p乘2~9中的一个数,给定一个n,当一个人操作后p>=n,那么这个人赢,问先手是否必胜. 必胜状态:存在一种走法走到一个必败状态. 必 ...
- hdu 4714
一个树形dp的题,又是一个涉及不深的领域 = =: 不过在网上看到了大神用很巧的思路解决了这个题: 大神的思路就是: 从树的底部往上看:如果一棵子树拥有两个及以上的叶子节点,可以将这棵子树与大树分离 ...