自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 堆排序

描述堆排序是一个效率要高得多的选择排序,首先把整个数组变成一个最大堆,然后每次从堆顶取出最大的元素,这样依次取出的最大元素就形成了一个排序的数组。堆排序的核心分成两个部分,第一个是新建一个堆,第二个是弹出堆顶元素后重建堆。新建堆不需要额外的空间,而是使用原来的数组,一个数组在另一个维度上可以当作一个完全二叉树(除了最后一层之外其他的每一层都被完全填充,并且所有的节点都向左对齐),对于下标为i的元素,他的子节点是2*i+1和2*i+2(前提是没有超出边界)。在新建堆的时候从左向右开始遍历,当遍历到一个元素

2020-09-14 10:09:09 131 1

原创 希尔排序

描述希尔排序可以看作是一个冒泡排序或者插入排序的变形。希尔排序在每次的排序的时候都把数组拆分成若干个序列,一个序列的相邻的元素索引相隔的固定的距离gap,每一轮对这些序列进行冒泡或者插入排序,然后再缩小gap得到新的序列一一排序,直到gap为1比如对于数组[5,2,4,3,1,2],第一轮gap=3拆分成[5,3]、[2,1]和[4,2]三个数组进行插入排序得到[3,1,2,5,2,4];第二轮gap=2,拆分成[3,2,2]和[1,5,4]进行插入排序得到[2,1,2,4,3,5];最后gap=1,全

2020-09-13 16:32:32 104

原创 快速排序

描述快速排序(有时称为分区交换排序)是一种高效的排序算法。由英国计算机科学家Tony Hoare于1959年开发并于1961年发表,它在现在仍然是一种常用的排序算法。如果实现方法恰当,它可以比主要竞争对手(归并排序和堆排序)快两到三倍。其核心的思路是取第一个元素(或者最后一个元素)作为分界点,把整个数组分成左右两侧,左边的元素小于或者等于分界点元素,而右边的元素大于分界点元素,然后把分界点移到中间位置,对左右子数组分别进行递归,最后就能得到一个排序完成的数组。当子数组只有一个或者没有元素的时候就结束这个

2020-09-13 16:13:34 112

原创 归并排序

描述归并排序是典型的使用分治思想(divide-and-conquer)解决问题的案例。在排序的过程中,把原来的数组变成左右两个数组,然后分别进行排序,当左右的子数组排序完毕之后,再合并这两个子数组形成一个新的排序数组。整个过程递归进行,当只剩下一个元素或者没有元素的时候就直接返回。C++代码实现class Solution {public: vector<int> sortArray(vector<int>& nums) { mergesor

2020-09-13 15:47:13 101

原创 插入排序

描述插入排序的核心思想是遍历整个数组,保持当前元素左侧始终是排序后的数组,然后将当前元素插入到前面排序完成的数组的对应的位置,使其保持排序状态。有点动态规划的感觉,类似于先把前i-1个元素排序完成,再插入第i个元素,构成i个元素的有序数组C++代码实现class Solution {public: vector<int> sortArray(vector<int>& nums) { int len = nums.size();

2020-09-13 15:38:39 80

原创 选择排序

描述选择排序的思路比较简单,先找到前n个元素中最大的值,然后和最后一个元素交换,这样保证最后一个元素一定是最大的,然后找到前n-1个元素中的最大值,和第n-1个元素进行交换,然后找到前n-2个元素中最大值,和第n-2个元素交换,依次类推到第2个元素,这样就得到了最后的从小到大的排序数组。如果从大到小排序,先找到前n个元素中最小的值,然后和最后一个元素交换,这样保证最后一个元素一定是最小的,然后找到前n-1个元素中的最小值,和第n-1个元素进行交换,然后找到前n-2个元素中最小值,和第n-2个元素交换,依

2020-09-13 15:30:58 65

原创 冒泡排序

描述冒泡排序是从左到右依次比较相邻的两个元素,如果前一个元素比较大,就把前一个元素和后一个交换位置,遍历数组之后保证最后一个元素相对于前面的永远是最大的。然后让最后一个保持不变,重新遍历前n-1个元素,保证第n-1个元素在前n-1个元素里面是最大的。依此规律直到第2个元素是前2个元素里面最大的,排序就结束了。因为这个排序的过程很像冒泡泡,找到最大的元素不停的移动到最后端,所以这个排序算法就叫冒泡排序。C++代码实现其过程:class Solution {public: vector<int

2020-09-13 08:49:02 93

原创 排序算法特性

简介排序算法是根据元素的对应的比较运算符重新排列给定的数组的算法,输出的数组是一个根据比较符从小到大或者从大到小依次排列的数组。比较运算符是用于确定相应数据结构中元素的新顺序,比如在整数数组里面,对应的比较符号就是大于或者小于号,用户也可以自己定义对应的比较运算符。比如如果输入是[5,4,2,3,1],按照从小到大输出,结果应该是[1,2,3,4,5]。特性稳定性如果在数组中有两个元素是相等的,在经过某个排序算法之后,原来在前面的的那个元素仍然在另一个元素的前面,那么我们就说这个排序算法是稳定的

2020-09-13 08:31:24 154

原创 指针函数,函数指针

一、指针函数指针函数是 返回指针的函数,【主体是函数】,返回值,是一个指针基本声明形式:返回数据类型 + * + 函数名 + (变量类型1,…);返回值是 int* 类型int* fun(int,int); #include<stdio.h>int* fun(int* x) //传入指针 { int* tmp = x; //指针tmp指向x return tmp; //返回tmp指向的地址}int main(){ int b =

2020-07-21 17:16:44 377

原创 指针数组,数组指针

指针数组:1)首先是一个数组2)数组的元素是指针。如果数组元素都是相同类型的指针,则称这个数组为指针数组。所谓相同类型的指针是说指针所指向的对象类型是相同的。一维,指针数组:指针数组中的每一个元素均为指针。ptr_array[i]; // ptr_array[i],是指第i+1个元素的指针二维,指针数组:char *ptr_array[3][3]={ {"asdx","qwer","fdsfaf"}, {"44444","555","6666"}, {"

2020-07-21 17:11:41 172

原创 C++类模板

类模板定义类模板由模板说明和类说明构成模板说明同函数模板,如下:template <类型形式参数表>类声明例如:template class ClassName{//ClassName 的成员函数private :Type DataMember;}类模板与函数模板的定义和使用类似,有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,我们可以通过如下面语句声明了一个类模板:template <typename T>class A{publ

2020-07-10 15:07:46 132

原创 C++之函数模板玩法

函数模板语法所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。函数模板定义形式由以下三部分组成: 模板说明 + 函数定义 + 函数模板调用template < 类型形式参数表 >类型 函数名 (形式参数表){//语句序列}模板说明

2020-07-08 09:31:59 126

原创 纯虚函数与抽象类

什么时候使用纯虚函数某些类,在现实角度和项目实现角度,都不需要实例化(不需要创建它的对象),这个类中定义的某些成员函数,只是为了提供一个形式上的接口,准备让子类来做具体的实现。此时,这个方法,就可以定义为“纯虚函数”, 包含纯虚函数的类,就称为抽象类。纯虚函数的使用方法用法:纯虚函数,使用virtual和 =0示例代码:#include <iostream>#include <string>using namespace std;class Shape {pu

2020-07-07 20:23:30 870

原创 C++多态

多态的本质形式上,使用统一的父类指针做一般性处理,但是实际执行时,这个指针可能指向子类对象,形式上,原本调用父类的方法,但是实际上会调用子类的同名方法。【注意】程序执行时,父类指针指向父类对象,或子类对象时,在形式上是无法分辨的!只有通过多态机制,才能执行真正对应的方法。虚函数的使用虚函数的定义:在函数的返回类型之前使用virtual,只在成员函数的声明中添加virtual, 在成员函数的实现中不要加virtual。虚函数的继承:如果某个成员函数被声明为虚函数,那么它的子类【派生类】,以及子

2020-07-07 19:09:35 89

原创 C++新特性-override

override仅能用于修饰虚函数。作用:提示程序的阅读者,这个函数是重写父类的功能。防止程序员在重写父类的函数时,把函数名写错。#include <iostream>using namespace std;class XiaoMi {public: virtual void func() { cout << "XiaoMi::func" << endl; };};class XiaoMi2 : public XiaoMi {public:

2020-07-07 17:57:33 141

原创 C++新特性-final

修饰类final用来修饰类,让该类不能被继承理解:使得该类终结!示例代码如下:其中XiaoMi3类不能再继承XiaoMi2类,因为XiaoMi2类已经用final修饰,将XiaoMi2类终结,不能再作为其他类的基类。class XiaoMi {public: XiaoMi(){}};class XiaoMi2 final : public XiaoMi { XiaoMi2(){}};class XiaoMi3 : public XiaoMi2 { //不能把XiaoMi2作为基

2020-07-07 17:40:50 209

原创 友元

友元的两种使用形式友元函数和友元类。友元函数使用全局函数作为友元函数假如已经设计好计算机类和计算机服务类,现在需要多计算机处理器进行升级,此时可以使用全局函数的友元形式实现。代码示例:Computer.h#pragma once#include <string>class Computer{public: Computer(); // 声明外部全局函数作为友元函数 friend void upgrade(Computer* computer); std::

2020-07-07 11:32:59 88

原创 使用虚基类和虚继承代替多重继承

多继承的缺陷例如:电话作为基类,座机类和手机类继承电话类,最后无线座机同时继承座机类和手机类,示意图如下:示例代码:#include <iostream> #include <string>#include <Windows.h>using namespace std;// 电话类class Tel {public: Tel() { this->number = "未知"; }protected: string number; /

2020-07-07 09:53:00 117

原创 继承与派生

继承和派生在UML中的表示假如以人类、男人类、女人类为例子。注意是“空心三角箭头”,从子类【派生的类】指向父类【被继承的类】父类,也称为“基类”。除了“构造函数”和“析构函数”,父类的所有成员函数,以及数据成员,都会被子类继承!派生和继承的实现父类:class Father{public: Father(const char*name, int age); ~Father(); string getName(); int getAge(); string descripti

2020-07-06 16:52:54 210

原创 C++ const使用注意事项

const数据成员的初始化方式:使用类内值(C++11支持)class Human {public: Human(); ~ Human();private: const int Age =18;};使用构造函数的初始化列表Human::Human():Age(18) { ......}(如果同时使用这两种方式,以初始化列表中的值为最终初始化结果)注意: 不能在构造函数或其他成员函数内,对const成员赋值!如果一个成员函数内部,不会修改任何数据

2020-07-04 19:18:22 146

原创 建模常用方式:组合与聚合

组合:举例:需求:构建一个计算机类,一台计算机,由CPU芯片,硬盘,内存等组成。CPU芯片也使用类来表示。因此,计算机和CPU的关系是组合。CPU.h#include <string>class CPU{public: CPU(const char *brand = "intel", const char *version="i5"); ~CPU();private: std::string brand; //品牌 std::string version; //型号

2020-07-04 16:55:23 411

原创 C++中类的静态成员

静态数据成员:对于非const的类静态成员,只能在类的实现文件中初始化,如下示例代码。Human.hclass Human {public: ......static int getCount();private: string name = "Unknown"; int age = 28; ...... // 类的静态成员 static int count;};Human.cpp#include "Human.h" // 初始化类的静态成员int Human::c

2020-07-03 21:27:41 172

原创 可重入函数和线程安全

可重入函数和线程安全 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。 可重入函数也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括s

2020-07-02 10:44:22 173

原创 快速幂算法

1.什么是快速幂算法所谓快速幂,就是用效率更高(时间复杂度更低)的方法求幂,可以将时间复杂度从O(n)优化至O(logn)。我们以求3 ^ 21为例子,来分析一下非递归的代码应该怎么写。首先21的二进制形式是10101不难得出以下结论3 ^ n(n为2、4、8、16)都可以由3 ^ 1累乘出来每一个3 ^ n都有对应的二进制位3 ^ 1对应二进制位的值是1,其实是二进制10101的最...

2020-04-15 14:22:02 236

原创 Ubuntu 16.04无法连接ssh服务解决方法

我使用的是Ubuntu16.0.4LTS系统,第一次安装完成以后远程连接SSH服务不成功,所用远程连接客户端是MobaXterm,大家也可用其他的类似客户端,第一次连接报Access denied。解决方法如下:1、先试着开启SSH服务在使用SSH之前,可以先检查SSH服务有没有开启。使用命令:sudo ps -e | grep ssh来查看,如果返回的结果是“xxxx? 00:00:...

2020-03-25 11:44:33 5501 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除