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& ...
随机推荐
- mssql sqlserver text、image字段类型无法使用DISTINCT的处理方法分享
转自: http://www.maomao365.com/?p=9775 摘要: 下文简述sqlserver数据库中 text image类型无法使用distinct的处理方法分享 实验环境:sql ...
- Codeforces Round #598 (Div. 3)
传送门 A. Payment Without Change 签到. Code /* * Author: heyuhhh * Created Time: 2019/11/4 21:19:19 */ #i ...
- MYSQL的备份与恢复--逻辑备份mysqldump
目录 0.备份与恢复概述 1.逻辑备份-完整备份与恢复 2.逻辑备份-增量备份与恢复 (1)环境准备 (2)恢复全量数据 (3)恢复增量备份 3.新来的开发妹子删了库! (1)模拟环境准备 (2)全备 ...
- acwing 848 有向图的拓扑序列
地址 https://www.acwing.com/problem/content/description/850/ 题目描述给定一个n个点m条边的有向图,图中可能存在重边和自环. 请输出任意一个该有 ...
- 如何理解Virtual DOM
什么是虚拟DOM 接下来用vdom(Virtual DOM)来简称为虚拟DOM. 指的是用JS模拟的DOM结构,将DOM变化的对比放在JS层来做.换而言之,虚拟DOM就是JS对象.如下DOM结构: & ...
- [Pytorch Bug] "EOFError: Ran out of input" When using Dataloader with num_workers=x
在Windows上使用Dataloader并设置num_workers为一个非零数字,enumerate取数据时会引发"EOFError: Ran out of input"的报错 ...
- Zookeeper集群的"脑裂"问题处理 - 运维总结
关于集群中的"脑裂"问题,之前已经在这里详细介绍过,下面重点说下Zookeeper脑裂问题的处理办法.ooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调 ...
- MySQL UNSIGNED和ZEROFILL属性
UNSIGNED 这个属性就是标记数字类型是无符号的,和C/C++语言中的unsigned含义是一样的,int signed的类型范围是-2147483648~2147483648,而int unsi ...
- tinker接入
对于热修复无非就是两大类,一类是tencent代表的classloader模式的,另一类是阿里系代表的底层方面替换. 下面以本人的经验介绍下微信的tinker接入: 命令行接入方式: gradle接入 ...
- three.js实现世界3d地图
概况如下: 1.THREE.Shape绘制世界地图平面地图: 2.THREE.ExtrudeGeometry将绘制的平面沿着Z轴拉伸,实现3d效果: 效果图如下: 预览地址:three.js实现世界3 ...