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

冒泡排序法需要两次扫描,所以从时间复杂度来说,是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++语言版)》邓俊辉

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中的jgroup_JGroups实现聊天小程序

本文实例为大家分享了JGroups实现聊天小程序的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下效果图&#xff1a;代码部分&#xff1a;package com.lei.jgoups;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;impor…

Windows Embedded CE 6.0开发初体验(五)构建CE平台

接下来的一节会有非常多的图&#xff0c;因为我们要在Visual Studio 2005里创建一个CE 6.0的平台&#xff08;Platform&#xff09;了。创建CE平台的方法和创建普通工程的方法类似。在完成了Platform Builder之后&#xff0c;我们打开Visual Studio 2005后&#xff0c;选择File…

一步一步学Silverlight 2系列(31):图形图像综合实例—实现水中倒影效果

概述 Silverlight 2 Beta 1版本发布了&#xff0c;无论从Runtime还是Tools都给我们带来了很多的惊喜&#xff0c;如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython&#xff0c;对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlig…

Windows Embedded CE 6.0开发初体验(六)平台定制

Windows CE是一个组件化的操作系统&#xff0c;我们可以根据不同的环境设置不同的组件来组合成有针对性的平台&#xff0c;而一个功能往往需要多个组件才能够实现。Catalog就是实现某个功能的组件集合&#xff0c;每个Catalog Item会包含一个或多个组件&#xff0c;而Catalog I…

【转】Win32 SDK 实现带图片的 Button 控件BM_SETIMAGE(Disable时图片不显示)

在编写对话框程序时&#xff0c;希望能在按钮控件里显示一个小插图,如图所示 最初使用的方法是使用 BM_SETIMAGE 消息&#xff0c;但却不能达到满意的效果&#xff0c;在网上查了一通资料&#xff0c;最后终于实现了&#xff0c;现在把实现的方法记下来。 首先来到MSDN上&…

解读设计模式----命令模式(Command Pattern)

***本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文。***原文连接http://www.dofactory.com/Patterns/PatternCommand.aspx命令模式意图&#xff1a;  GOF 在《设计模式》一书中阐述其意图&#xff1a;“将一个请求封装为一个对象&#xff0c;从而…

Windows Embedded CE 6.0开发初体验(七)编译和调试平台

在完成Catalog选择之后&#xff0c;平台定制的工作告一段落&#xff0c;接下来&#xff0c;我们就要进入变数最多的环节——“编译和调试”平台了。编译的操作简单&#xff0c;但是想通过编译却有很多变数。 编译平台的第一步是选择Debug或者Release版本。选择 Build菜单中的C…

python合并单元格 索引_python笔记:纵向合并表格

工作中我们常常遇到多个格式相同的表格面要合并成一个表格&#xff0c;比如将2019年的数据与2020年的数据合并在一起来进行分析。平时EXCEL时我们通常直接复制粘贴&#xff0c;但有时因表格内容过大&#xff0c;直接粘贴效率低&#xff0c;且当字段过多时还需要进行逐列粘取我们…

【转】Win32子窗口控件(按钮、编辑框、静态框、滚动条等)!!

前言&#xff1a; 子窗口控件是特殊的子窗口&#xff0c;不需要我们注册窗口类&#xff0c;系统已经注册好了&#xff0c;我们只需要在创建时选择相应的窗口类名。常用的子窗口控件有按钮BUTTON、组合框COMBOBOX、编辑框EDIT、列表框LISTBOX、静态框STATIC、滚动条SCROLLBAR等类…

在PC上用模拟器搭建Windows Mobile仿真环境:Microsoft Device Emulator使用

因为工作需要&#xff0c;体验了一下微软的移动设备模拟器Device Emulator 3.0。在此把一些使用体验写出来和大家交流一下&#xff0c;在自己摸索过程中从网上找了很多资料参考&#xff0c;希望大家再做这个的时候少走一些弯路%^) 在PC上用模拟器搭建Windows Mobile仿真环境&am…

【转】QT布局QGridLayout QHBoxLayout QVBoxLayout简要分析!!

转自&#xff1a;https://blog.csdn.net/sabcdefg/article/details/106693203 在分析之前,先吐槽下M$的MFC,竟然没有相对布局!(至少我不知道,每次都是使用代码控制布局), M$这么多年,也不发展一下,你看C#都有相对布局... 参考精通Qt4编程&#xff08;第2版&#xff09;,先看看…

php下拉选项登录_php下拉选项的批量操作的实现代码

实现功能&#xff0c;操作项可以单独删除&#xff0c;批量项可以批量删除&#xff0c;批量显示&#xff0c;隐藏(改广告的数据库的status_is的值)&#xff1b;1.视图关键点&#xff1a;<?php echo $row->id?>全选选择操作删除显示隐藏/*单个删除*/2.控制器&#xff…

协议栈开发学习总结

近来一直很少些关于技术方面的文章&#xff0c;一来是被工作和生活所累&#xff0c;没有很多闲暇多余的时间,二来呢是觉得一直没有好的case&#xff0c;或则有好的case&#xff0c;但觉得目前在这个case方面&#xff0c;自己还不算很professional。今天心情不错&#xff0c;感觉…

【转】QGridLayout 详解

转自&#xff1a;https://blog.csdn.net/u013928315/article/details/78123573 一、QGridLayout属性介绍 1、QGridlayout以方格的形式管理窗口部件&#xff0c;先看QGridLayout的属性&#xff0c;如下图 2、各个参数的介绍 layoutLeftMargin ...至layoutBottomMargin在ui_Mai…

java import 出错,Eclipse的java代码出错:The import XXXX cannot be resolved

折腾Eclipse时&#xff0c;经常会遇到这种情况&#xff1a;缺少某个库&#xff0c;找到之后&#xff0c;需要将该库&#xff0c;jar包&#xff0c;加入到当前项目&#xff0c;使得代码中的import xxx得以正常导入。【如何在Eclipse中导入/添加(外部的)库/jar包】基本思路&#…

WCF从理论到实践(14):WCF解决方案模板 (转)

WCF从理论到实践(14):WCF解决方案模板 正所谓磨刀不误砍柴工,虽然VS2008为我们提供了WCFServiceLibrary项目模板,但在实际开发的时候,我们通常更喜欢按照自己的方式来建立WCF项目,通常情况下,我们将服务契约(通常是接口)数据契约,消息契约等契约单独作为一个项目,而将服务的实现…

thinkphp index.php隐藏,thinkphp5怎么隐藏index.php入口文件?

隐藏方法&#xff1a;1、打开apache的http.conf配置文件&#xff0c;开启mod_rewrite.so模块&#xff1b;2、AllowOverride None项中将None改为All&#xff1b;3、修改“.htaccess”的配置内容&#xff0c;将原代码替换为官方手册提供的代码。thinkphp现在的php主流框架之一&am…

【转】extern “C“和__declspec(dllexport)以及__declspec(dllimport) 和def的简单解析

转自&#xff1a;https://blog.csdn.net/xupan_jsj/article/details/9028759 前面的extern "C" __declspec(dllexport) __declspec(dllimport)都是用于函数或者变量&#xff0c;甚至类的声明的&#xff08;可以把extern "C"放在class的前面&#xff0c;…

【转】extern “C“以及__declspec(dllexport) 讲解和def文件dll导出方法

转自&#xff1a;https://blog.csdn.net/qing666888/article/details/41135245 一&#xff0c;__ declspec&#xff08;dllexport&#xff09;&#xff1a; 将一个函数声名为导出函数&#xff0c;就是说这个函数要被其他程序调用&#xff0c;即作为DLL的一个对外函数接口。通常…

【转】DICOM医学图像处理:浅析SWF、MWL、SPS、MPPS

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/40151107 背景&#xff1a; 最近重新花时间阅读了DICOM标准&#xff0c;顺带着看了一下HL7标准和IHE&#xff0c;对标题中提到的SWF、MWL、SPS和MPPS有了更进一步的认识&#xff0c;现将自己的理解整理出来&a…