冒泡排序法需要两次扫描,所以从时间复杂度来说,是O(n2).

如果用图形表示,是这样的:

但是我们可以加以改进。

首先是,如果在排序中间,整个向量已经达到了有序状态,可以直接跳出来。

这样它的复杂度由一个三角形变为一个梯形。

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

深蓝色为可能占用的时间复杂度。

我自己写了一个代码测试了一下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

#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 2*a;
}

3、出错解析:

这四行加起来是一个错误,编译器只不过在提示。

比如第一句是:在bubble函数的使用中

第二行解释其中是因为Mysort需要使用这个函数

第三行如果我们点击,提示出现在主函数中,是Mysort的使用的地方

第四行是真正的错误,也就是swap函数没有定义

4、运行结果:

上述算法就是sort()排序方法的一种实现原理

参考书籍:

1---《数据结构(C++语言版)》邓俊辉

【转】C++学习四 冒泡排序法的一些改进相关推荐

  1. 排序1+1:冒泡排序法(BubbleSort)的改进以及效率比较

    1 我要冒泡 冒泡排序这个名字对于我们来说实在是过于熟悉了.作为一个程序员,如果敢说出自己不会冒泡排序,结局肯定是会被鄙视到火星上去.许多公司到学校去招聘应届毕业生的时候,都会要求写一个冒泡排序.毫无 ...

  2. 冒泡排序python例题_零基础学python 15 经典算法:冒泡排序法(课后习题答案)...

    这节课我们对于冒泡排序法的课后习题进行一下解答: 回顾一下我们的题目: 上节课我们学习的冒泡排序法,是让我们的list从小到大进行排列,这次我们的任务是,请对冒泡排序法进行一定的修改,加一个参数,让它 ...

  3. 【C语言程序】某班级学习委员整理获得奖学金排名,总成绩=智育成绩*60%+德育成绩*30%+体育成绩*10%,使用冒泡排序法将班级前12名同学的成绩进行排名。

    某班级学习委员整理获得奖学金排名,总成绩=智育成绩*60%+德育成绩*30%+体育成绩*10%,使用冒泡排序法将班级前12名同学的成绩进行排名. 题出自------------------------ ...

  4. c语言冒泡排序项目总结,C语言冒泡排序法心得

    记得以前在大学里学习c语言的时候,刚开始是很吃力的. 入门级别的算法中有个叫冒泡排序法,也有称为气泡排序法.那时候刚接触它就对它的名字特别感兴趣,因为觉得很有意思.好了,废话不多说了,我们先一起简单回 ...

  5. 冒泡排序法c语言实验报告,微机原理实验报告-冒泡排序

    <微机原理实验报告-冒泡排序>由会员分享,可在线阅读,更多相关<微机原理实验报告-冒泡排序(12页珍藏版)>请在人人文库网上搜索. 1.一.实验目的(1)学习汇编语言循环结构语 ...

  6. C语言十个字母用冒泡法排序,冒泡排序法(C语言) - osc_wq8j2a9a的个人空间 - OSCHINA - 中文开源技术交流社区...

    常用的排序方法有冒泡排序法,选择排序法,插入排序法以及希尔排序法等.本文着重讲解如何利用C代码,实现冒泡排序. 首先,要了解什么是冒泡排序.冒泡排序是常用的一种排序方法,其基本方法就是逐次比较.即一次 ...

  7. 探索初级算法学习笔记-快速排序法

    快速排序法学习笔记 #include<stdio.h>void swap(int *a,int *b) {int t;t=*a;*a=*b;*b=t; }void quickSort(in ...

  8. C——用冒泡排序法、选择排序法对随机输入的10个整数从小到大排序

    //冒泡排序法 #include <stdio.h> int main() {int i,j,t,a[10];for(i=0;i<10;i++){scanf("%d&quo ...

  9. 生活中c语言排序案例,C语言之数字排序-基于冒泡排序法的一些案例(对未知数量的数字进行排序)...

    C语言之数字排序 在学习C语言的时候遇到了几个比较基础的排序问题,又结合了之前的处理方法.觉得在这个需要再系统地进行复习一下. 当我们在初学C语言的时候,我们都会结合三个数字的排序来理解计算机处理问题 ...

最新文章

  1. 数据库里存json数据
  2. web 监听器 过滤器等组件
  3. Spring 和 SpringBoot 最核心的 3 大区别,详解!
  4. 代码开源!激光雷达 SLAM 的闭环检测:OverlapNet
  5. 学习jquery选项卡插件
  6. ACM学习历程—Hihocoder 1290 Demo Day(动态规划)
  7. 在VS中编译C++静态库以及使用的方法
  8. SAP CRM BP contact detail - workAddress
  9. android 面试题(一)
  10. 【光说不练假把式】今天说一说Kubernetes 在有赞的实践
  11. AD Framework 单点登录
  12. 程序员最想要十八般武艺俱全的“保姆型”项目经理!
  13. JVM 类加载机制详解
  14. python赋值运算符_解释一下python中的赋值运算符
  15. 笔记本计算机风扇连线,机箱风扇接口怎么接电源线【图文】
  16. EXCEL-解决表格被锁定和分组的冲突
  17. Codeforces633H-Fibonacci-ish II
  18. Python处理二进制流(一)
  19. 删除快照出现提示框:删除时出错 字典问题
  20. 复盘百度移动化,下一步去哪儿?

热门文章

  1. svn 版本升级的问题
  2. [SimplePlayer] 2. 在屏幕上显示视频图像
  3. Linux服务部署之NTP时间服务器
  4. LOJ#6002. 「网络流 24 题」最小路径覆盖
  5. struts2值栈,OGNL表达式,interceptor
  6. grafana授权公司内部邮箱登录 ldap配置
  7. [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]
  8. [剑指offer][JAVA]面试题第[09]题[用两个栈实现队列][LinkedList]
  9. 51nod 1101 换零钱 简单dp
  10. ionic android 本地存储,ionic2/3本地数据存储storage