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

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

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

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

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

  3. React组件二

    <script type="text/babel"> <!-- this.props.children表示读取组件的所有子节点-->var Zu=React ...

  4. HTML5学习笔记----html5与传统html区别

    一. HTML5语法的改变 该知识点所说变化指的是基于HTML4基础上所定义的改变,主要有如下: HTML5的文件扩展符(.html或.htm)与内容类型(text/html)保持不变. HTML5中 ...

  5. float right 换行bug

    Bug产生原因:块里面有换行的元素. CSS: .left{float: left;width: 100px;background: #fff000;} .right{float: right;wid ...

  6. validate插件的使用

    方法如下: 插件: jquery.validate.js jquery.validate.custom.js bootstrap html代码: <form id="form_name ...

  7. 解决cocos2d 热更是连不上https服务器

    最近苹果宣布所有上架应用都要用https,我们后端走的是同一个函数,导致Android也要连接https. 百度了下,网上说客户端不需要做什么特殊处理,因为cocos本身是支持https的.但是服务端 ...

  8. KVC - 键值编码

    [基本概念] 1.键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性. 2.键值编码方法在OC非正式协议(类目)NSKeyValueCoding中被声明, ...

  9. avalon中require的实现

    var plugins = { loader: function(builtin) { window.define = builtin ? innerRequire.define : otherDef ...

  10. C语言里的指针探析——type *name[] 在函数参数里面,是一个二维指针

    type *name[] 在函数参数里面声明和不在函数里面声明其实不一样. type *name[] 如果在函数参数里声明,则name 是一个二维指针,并不是一个指针数组,而如果不在函数参数里声明,则 ...