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& ...
随机推荐
- CK:User mode Bus Error(用户空间操作内核地址导致的异常)
关键词:VEC_ACCESS.coredump.LR.PC等. CK中存在一种VEC_ACCESS异常,可能原因是用户空间访问了内核空间,还有一种是内核访问不存在的总线地址. 下面简单构造VEC_AC ...
- Python函数名做参数,闭包,装饰器
简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数.就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数. 请看下 ...
- Python机器学习笔记——One Class SVM
前言 最近老板有一个需求,做单样本检测,也就是说只有一个类别的数据集与标签,因为在工厂设备中,控制系统的任务是判断是是否有意外情况出现,例如产品质量过低,机器产生奇怪的震动或者机器零件脱落等.相对来说 ...
- python selenium 处理时间日期控件
# -*- coding: utf-8 -*- from selenium import webdriverfrom time import sleep driver = webdriver.Fire ...
- LG4516/LOJ2546 「JSOI2018」潜入行动 树上背包
问题描述 LG4516 LOJ2546 题解 好一个毒瘤题. hkk:JSOI的签到题 设\(opt[i][j][0/1][0/1]\)代表结点\(i\)的子树,放置\(j\)个,\(i\)放不放,\ ...
- 第05组 Alpha冲刺(2/4)
第05组 Alpha冲刺(2/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了 ...
- Spring Batch基本概念
Spring batch主要有以下部分组成: JobRepository 用来注册job的容器 JobLauncher 用来启动Job的接口 Job ...
- lua require路径设置实例
1.首先要强调的是,lua require的路径用的是斜杠"/",而不是从Windows文件属性那里复制来的反斜杠"\". 2.通过 print(pagckag ...
- 使用HTMLTestRunner模块更优美地展示接口测试报告
优化版本的HTMLTestRunner模块,从我的百度网盘获取: 链接:https://pan.baidu.com/s/1f8eLpX5qBrpJsVlXKjquRQ 提取码:qqlu 测试报告展示: ...
- 前端框架Easyui学习积累
前端框架Easyui学习积累 1.easyui textbox 赋值:$("#id").textbox("setValue","xx"); ...