C++学习四 冒泡排序法的一些改进
冒泡排序法需要两次扫描,所以从时间复杂度来说,是O(n2).
如果用图形表示,是这样的:

但是我们可以加以改进。
首先是,如果在排序中间,整个向量已经达到了有序状态,可以直接跳出来。
这样它的复杂度由一个三角形变为一个梯形。

同时,可能存在部分有序的状态,所以可以再次改进:

深蓝色为可能占用的时间复杂度。
我自己写了一个代码测试了一下:
#include<iostream>
#include<vector>
#include <algorithm>//question1: 使用swap()需要包含这个头文件,
using namespace std; //函数模板,这是冒泡排序的主要过程
template <typename T1>
T1 bubble(T1 lo, T1 hi,int *x)
{
T1 last=lo;
while(++lo<hi)
if(x[lo-1]>x[lo])
{
last=lo;
swap(x[lo-1],x[lo]);//question2:格式是std::swap, 所以如果单独使用
//前面还需要定义using namespace std;
}
return last;
} template <typename T1>//question3:每一个模板函数都需要申明一遍参数
void MySort(int*x, T1 lo, T1 hi )
{ while(lo<(hi=bubble(lo, hi, x))); } int main(void)
{
//int x=0;
//cout<<"the result is "<<x<<endl;
int p[7]={1,3,5,2,1,7,2};
int low=0;
int high=7;
MySort(p,low,high);
for(int i=0;i<7;i++)
cout<<"the result is "<<p[i]<<endl;
return 0;
}
遇到问题:
1、使用swap()的时候,格式是:
#include <algorithm>
using namespace std;
swap(a,b);
2、使用模板函数的时候,每一个模板函数都需要声明template <typename T> , 格式如下:
template <typename T>
T Mysort(T a) //与一般函数用法相同
{
return *a;
}
3、出错解析:

这四行加起来是一个错误,编译器只不过在提示。
比如第一句是:在bubble函数的使用中
第二行解释其中是因为Mysort需要使用这个函数
第三行如果我们点击,提示出现在主函数中,是Mysort的使用的地方
第四行是真正的错误,也就是swap函数没有定义
4、运行结果:

上述算法就是sort()排序方法的一种实现原理
参考书籍:
1---《数据结构(C++语言版)》邓俊辉
C++学习四 冒泡排序法的一些改进的更多相关文章
- php 四种基础的算法 ---- 冒泡排序法
1. 冒泡排序法 * 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来. * 比如:2,4,1 // 第一次 冒出的泡是4 * ...
- C#冒泡排序法学习
一,冒泡排序法理解:就是将一个集合里的数据当前位置和后一位比较,然当前位置大于后一位,则两个位置替换,直到排序完成 using System; using System.Collections.Gen ...
- php排序学习之-冒泡排序
原理:对一组数据,比较相邻数据的大小,将值小数据在前面,值大的数据放在后面. (以下都是升序排列,即从小到大排列) 举例说明: $arr = array(6, 3, 8, 2, 9, 1); $a ...
- python排序之二冒泡排序法
python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...
- C语言 数组输出,冒泡排序法,沉底排序法,二维数组输出,输出字母列长度,从随机数组中找重复数
#include <stdio.h> #define sum 3+4//宏定义是原封不动的使用used for test4 #include <time.h>//used fo ...
- TweenMax动画库学习(四)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- PHP 冒泡排序法
<?php // 冒泡排序法:将一个数组中的值按照从小到大的顺 序排序 $arr = array(33, 1, 4, 5, 2, 3, 7, 9, 8, 99); $len = count($a ...
- 关于Java中的选择排序法和冒泡排序法
一,这种方法是直接传入一个数组进行排序(选择排序法) public static void selectSort(int arr[]){ for (int i = 0; i < arr.leng ...
- java算法之冒泡排序法
由此可见:N个数字要排序完成,总共进行N-1趟排序,每第 i 趟的排序次数为 (N-i) 次,所以 可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即 for(inti=0;i& ...
随机推荐
- How To Restore Rman Backups On A Different Node When The Directory Structures Are Different (Doc ID 419137.1)
How To Restore Rman Backups On A Different Node When The Directory Structures Are Different (Doc ID ...
- 学习笔记:Django开发网上教育平台(参考了慕课网的教学视频)
第一步:进行环境的搭建(用到的IDE:pycharm ,数据库为mysql.nacicat.编辑语言python3.7.以及自己配置的虚拟环境venvpy37) Django==2.2 配置好 ...
- 【1期】mysql必知必会
再有人问你为什么MySQL用B+树做索引,就把这篇文章发给她
- Ovirt 简单配置
Ovirt是一款开源的虚拟化平台管理 主要组成: 1.OvirtEngine Server 用于管理和分配资源 ,能通过web管理 2.Hosts 提供虚拟化功能,提供CPU资源和内存资源,用于分配给 ...
- acwing 167. 木棒
乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位. 然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度. 请你设计一个程序,帮助乔 ...
- layUI学习第二日:非模块化方法使用layUI
layUI采用非模块化方式(即所有模块一次性加载),操作示例代码如下(如果问怎么创建项目和工具,参考layUI学习第一日的步骤): 运行的结果如下: 运行的显示不会太持久,过几秒就会消失,具体封装的代 ...
- Mybatis和Hibernate框架的区别
Mybatis和Hibernate框架的区别1 简单简介 1.1 Hibernate 框架 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据 ...
- Mac OSX vim配色方案选择
首先查看系统自带的vim配色种类: ls /usr/share/vim/vim73/colors 大致输出如下: README.txt default.vim elflord.vim morning. ...
- 百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题
UidGenerator是百度开源的Java语言实现,基于Snowflake算法的唯一ID生成器.而且,它非常适合虚拟环境,比如:Docker.另外,它通过消费未来时间克服了雪花算法的并发限制.Uid ...
- pytest框架与unittest框架的对比
一.pytest的优势 pytest是基于unittest之上的单元测试框架,它的优势如下: 自动发现测试模块和测试方法 断言使用 assert + 表达式 可以设置测试会话级(session).模块 ...