冒泡排序法需要两次扫描,所以从时间复杂度来说,是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++学习四 冒泡排序法的一些改进的更多相关文章

  1. php 四种基础的算法 ---- 冒泡排序法

    1. 冒泡排序法  *     思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来.  *     比如:2,4,1    // 第一次 冒出的泡是4  *             ...

  2. C#冒泡排序法学习

    一,冒泡排序法理解:就是将一个集合里的数据当前位置和后一位比较,然当前位置大于后一位,则两个位置替换,直到排序完成 using System; using System.Collections.Gen ...

  3. php排序学习之-冒泡排序

    原理:对一组数据,比较相邻数据的大小,将值小数据在前面,值大的数据放在后面.   (以下都是升序排列,即从小到大排列) 举例说明: $arr = array(6, 3, 8, 2, 9, 1); $a ...

  4. python排序之二冒泡排序法

    python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...

  5. C语言 数组输出,冒泡排序法,沉底排序法,二维数组输出,输出字母列长度,从随机数组中找重复数

    #include <stdio.h> #define sum 3+4//宏定义是原封不动的使用used for test4 #include <time.h>//used fo ...

  6. TweenMax动画库学习(四)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  7. PHP 冒泡排序法

    <?php // 冒泡排序法:将一个数组中的值按照从小到大的顺 序排序 $arr = array(33, 1, 4, 5, 2, 3, 7, 9, 8, 99); $len = count($a ...

  8. 关于Java中的选择排序法和冒泡排序法

    一,这种方法是直接传入一个数组进行排序(选择排序法) public static void selectSort(int arr[]){ for (int i = 0; i < arr.leng ...

  9. java算法之冒泡排序法

    由此可见:N个数字要排序完成,总共进行N-1趟排序,每第 i 趟的排序次数为 (N-i) 次,所以 可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即   for(inti=0;i& ...

随机推荐

  1. 安装HomeBrew 失败的解决方案(Error: Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core failed!)

    在安装HomeBrew(或者安装成功 执行相关指令)时遇到错误提示: Error: Failure while executing: git clone https://github.com/Home ...

  2. 【转载】Java中的多线程超详细的总结

    引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...

  3. postman---postman提示 Could not get any response

    在通过postman请求做接口测试的过程中,有时候会遇到一些报错,当遇到这些报错我们不要着急,看着具体哪里报错,然后进行解决 postman报错 经常使用postman的小伙伴们都应该遇到过一些报错, ...

  4. 浅谈JS重绘与回流

    在说浏览器渲染页面之前,我们需要先了解两个点,一个叫 浏览器解析 URL,另一个就是本章节将涉及的 重绘与回流: 重绘(repaint):当元素样式的改变不影响布局时,浏览器将使用重绘对元素进行更新, ...

  5. JAVA中int转String类型有三种方法

    String.valueOf(i) Integer.toString(i) i+"" i+""也就是一个int型的常量.+上个空的字符串,这里牵涉到了strin ...

  6. 解决java poi导出excel2003不能超过65536行的问题

    java poi在导出数据到excel2003工作表中时一个工作表只能存储65536行数据,如果超过这个数据就会失败,excel2007并没有这个问题,但是为了兼容性我们通常都是导出到2003版本上的 ...

  7. Python程序中的协程操作-greenlet模块

    目录 一.安装模块 二.greenlet实现状态切换 三.效率对比 一.安装模块 安装:pip3 install greenlet 二.greenlet实现状态切换 from greenlet imp ...

  8. Saiku嵌入页面plugin=true效果自定义实现(二十七)

    Saiku嵌入页面使用 自定义实现 Plugin=true 效果 saiku嵌入页面plugin=true时数据不显示(plugin=false或者不设定plugin的值时数据显示正常)这个问题困扰了 ...

  9. Oracle - v$lock查询慢原因分析

    数据库内部对象X$统计信息过旧,导致v$lock查询慢 前段时间用python写了个zabbix监控脚本,里面有一个检查锁的sql语句,sql语句是这样子的select count(*) retval ...

  10. Vue实现简单的列表金额计算效果(简易购物车)

    效果图: 使用技术:v-for v-bind v-on实现简单的列表选中绑定操作 代码: <!DOCTYPE html> <html> <head> <met ...