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

先来说说平常一般的冒泡算法,使用两个循环,外循环作为整体排序,每趟循环使未排序元素中的最大(小)值归位(到达其最终位置)。内循环用于两两相邻元素比较。每次对一组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判断使冒泡排序效率提高的更多相关文章

  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. .net ajax式上传文件

    今天在这里介绍一下ajax上传文件.其实也不算是真的使用xmlhttprequest上传,只是使用了iframe实现了无刷新上传而已,最多也只算 是仿ajax上传文件.然而网上关于使用xmlhttpr ...

  2. xcopy总是询问是文件名还是目录名

    我需要运行类似xcopy /y a.xml .\pics\b.xml很多次,但xcopy总是问我“文件名还是目录名” 可以这样通过管道来做echo f | xcopy /y a.xml .\pics\ ...

  3. C++ 11 笔记 (六) : 随机数

    以前生成一个随机数都是这样: srand(time(NULL)); rand(); 在C++11中,标准库中增加了随机数引擎 std::default_random_engine 这个好东西,然后我们 ...

  4. 双积分式(A/D)转换器电路结构及工作原理

    1.转换方式 V-T型间接转换ADC. 2.  电路结构 图1是这种转换器的原理电路,它由积分器(由集成运放A组成).过零比较器(C).时钟脉冲控制门(G)和计数器(ff0-ffn)等几部分组成 图1 ...

  5. 教你在你的应用程序中扩展使用dynamic类型

    教你在你的应用程序中扩展使用dynamic类型 相信大家在开发中经常会接触到mvc中的ViewBag,有心的同学会,发现这就是一个dynamic类型,查看源码一谈究竟,本文也是根据dynamic来扩展 ...

  6. Android引导界面

    一.所需素材       很有必要整理一下,里面附带友盟的社会化分享组件,我就不去掉了. 二.代码 import com.umeng.update.UmengUpdateAgent; import a ...

  7. Spring 使用外部部署文件

    1.导入属性文件: <context:property-placeholder location="classpath:db.properties"/> 2.使用外部化 ...

  8. 解决CAS单点登录出现PKIX path building failed的问题

    在一次调试中,出现了这个错误: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExceptio ...

  9. 通过硬件层提高Android动画的性能

    曾有许多人问我为什么在他们开发的应用中,动画的性能表现都很差.对于这类问题,我往往会问他们:你们有尝试过在硬件层解决动画的性能问题么? 我们都知道,在播放动画的过程中View在每一帧动画的显示时重绘自 ...

  10. unicode转中文

    <pre name="code" class="html">[root@dr-mysql01 ~]# cat a1.pl my $str=" ...