C++/数据结构
文章平均质量分 81
哈哈哈哈哈哈丶
花有重开日,人无再少年。
展开
-
单链表的实现。
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。SListNode* BuyNode(DataType x);//申请节点void PrintSlist(SListNode* pHead);//打印链表void InitSList(SListNode*& pHead);//初始化链表void PushBack(SListNode*& pHead, DataType x);//尾插void PopBack(SListNode*& pHead);//尾删原创 2016-12-04 22:09:13 · 431 阅读 · 0 评论 -
C++智能指针(二):模拟实现三种智能指针
上一篇博客我们简单介绍了智能指针:简单介绍智能指针有关shared_ptr的循环引用问题可以参考博客:weak_ptr–解决shared_ptr循环引用问题auto_ptr模拟实现template<class T>class Autoptr{public: Autoptr(T* ptr = NULL) :_ptr(ptr) {} Autoptr(Autop原创 2017-08-10 21:47:25 · 1046 阅读 · 0 评论 -
【排序算法】:冒泡排序
介绍原理:(升序)比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。时间复杂度:O(N^2); 空间复杂度:O(1); 稳定性:稳定代码实现:void BubbleSort原创 2017-08-11 14:22:29 · 414 阅读 · 1 评论 -
【排序算法】:选择排序
介绍选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。平均时间复杂度:O(n2) 空间复杂度:O(1) (用于交换和记录索引) 稳定原创 2017-08-11 11:02:45 · 390 阅读 · 0 评论 -
【排序算法】:直接插入排序
介绍思想:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 实现原理:第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 时间复杂度:O(N^2); 空间复杂度:O(1); 稳定性:稳定;代码实现代码实现://直接插入排序原创 2017-08-11 10:17:22 · 465 阅读 · 0 评论 -
【排序算法】:堆排序
介绍堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的升序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。思想: 用升序建大堆,降序建小堆。(我原创 2017-08-11 11:16:37 · 476 阅读 · 0 评论 -
【排序算法】:归并排序
介绍归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中原创 2017-08-11 16:50:32 · 421 阅读 · 0 评论 -
【排序算法】:快速排序
介绍快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。三数取中我们在 进行快速排序时需要把数据划分为两个部分,需要一个key值。为了避免极端情况(key值是最大或最小值–>划分的两原创 2017-08-11 16:38:08 · 509 阅读 · 0 评论 -
【排序算法】:计数排序
思路: 设被排序的数组为A,排序后存储到B,C为临时数组。所谓计数,首先是通过一个数组C[i]计算大小等于i的元素个数,此过程只需要一次循环遍历就可以;在此基础上,计算小于或者等于i的元素个数,也是一重循环就完成。下一步是关键:逆序循环,从length[A]到1,将A[i]放到B中第C[A[i]]个位置上。原理是:C[A[i]]表示小于等于a[i]的元素个数,正好是A[i]排序后应该在的位置。而且原创 2017-08-14 14:58:08 · 485 阅读 · 0 评论 -
【排序算法】:基数排序
定义基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。原理原创 2017-08-14 17:53:13 · 449 阅读 · 0 评论 -
【排序算法】:希尔排序
介绍希尔排序是一种插入排序算法,它出自D.L.Shell,因此而得名。Shell排序又称作缩小增量排序。原理图: 思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2代码实现void ShellSort(int* arr, int len){ assert(arr);原创 2017-08-11 10:47:20 · 409 阅读 · 0 评论 -
C++智能指针(三):weak_ptr--解决shared_ptr循环引用问题
weak_ptr--解决shared_ptr循环引用问题我们在上篇博客讲了模拟实现三种智能指针:模拟实现三种智能指针循环引用但是我们说了,shared_ptr存在循环引用的问题。我们先介绍一下什么是shared_ptr的循环引用。我们知道,智能指针shared_ptr采用的是引用计数的方式,下面我们来写一个双向链表。#include<iostream>原创 2017-08-11 09:48:18 · 2661 阅读 · 0 评论 -
C++智能指针(一):智能指针的简单介绍
智能指针的简单介绍,RAII,auto_ptr,scoped_ptr(boost) unique_ptr(c++11) 防拷贝 –简单粗暴的设计 ,3.shared_ptr(boost/c++11) 引用计数 –功能强大(支持拷贝,支持定制删除器) 缺陷–循环引用(可采用weak_ptr配合解决RAII定义RAII(Resource Acquisition Is Initialization),也称为“资源获取就是原创 2017-08-10 21:11:59 · 455 阅读 · 0 评论 -
C/C++内存管理:malloc/calloc/realloc区别和联系
malloc/calloc/realloc区别和联系。用法详解头文件它们三个头文件均为:#include <stdlib.h>函数原型mallocvoid *malloc(size_t size);void* 表示未确定类型的指针,void *可以指向任何类型的数据. **参数:**size为需要内存空间的长度. 返回值:成功返回系统分配的地址,失败返回NULL。callocvoid *calloc(si原创 2017-08-09 11:38:09 · 327 阅读 · 0 评论 -
静态顺序表的实现
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。分为静态顺序表和动态顺序表。void InitSeqList(SeqList* seq);//初始化顺序表void DestorySeqList(SeqList* seq);//销毁顺序表//增删改查void PushBack(SeqList* seq, DataType x);//从尾原创 2016-12-04 10:56:45 · 400 阅读 · 0 评论 -
动态顺序表的实现
动态顺序表。void CheckCapacity(SeqList* seq);//检查空间是否够大void InitSeqList(SeqList* seq);//初始化顺序表void DestorySeqList(SeqList* seq);//销毁顺序表//增删改查void PushBack(SeqList* seq, DataType x);//从尾部插入元素void Popback(SeqList* seq);//从尾部删除元素void PushFront(SeqList* seq原创 2016-12-04 11:06:43 · 459 阅读 · 0 评论 -
浅谈菱形虚拟继承
当我们谈到C++时首先会想到什么?我想大多数会想到C++的三大特性,封装,继承,多态。今天我们就浅谈一下菱形虚拟继承。我们要谈菱形继承,首先要弄明白什么是菱形继承,它的作用是什么。菱形继承:两个子类继承同一个父类,而又有子类同时继承这两个子类。例如:原创 2017-02-15 20:43:33 · 620 阅读 · 0 评论 -
数据结构--中缀表达式转为后缀表达式(逆波兰表达式)
数据结构--中缀表达式转为后缀表达式(逆波兰表达式)中缀表达式是一个通用的算术或逻辑公式表示方法。操作符是以中缀形式处于操作数中间。例如:3*4+3-1;后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右(不再考虑运算符的优先规则)例如:(2+1)*3,即2 1 + 3 *(以上来自百度百科)具体的代码实现:点击打开链接1.中缀表达式转为后缀表达式想要完成此过程需要一个数组arr存放中原创 2017-03-18 00:10:26 · 4188 阅读 · 2 评论 -
数据结构--简单实现计算器
数据结构--简单实现计算器中缀表达式转为后缀表达式实现计算器原创 2017-03-17 22:43:10 · 7656 阅读 · 2 评论 -
实现不带头结点的单链表
链表:链表是一种线性表,但不是顺序存储,而是每个节点里面存储者下一个节点的指针,把存储数据元素的数据串链起来。不带头结点的链表也可以分为三种:我们的代码实现的是第二种:#define _CRT_SECURE_NO_WARNINGS 1#include#includeusing namespace std;//不带头结点的链表(含有指向头结点和尾节点的指原创 2017-03-23 10:18:07 · 1091 阅读 · 0 评论 -
带头结点的双向循环链表
带头结点的双向循环链表:代码实现:#define _CRT_SECURE_NO_WARNINGS 1#include#includeusing namespace std;templatestruct ListNode{ T _data; ListNode* _prev; ListNode* _next; ListNode(const T& x=T())原创 2017-03-23 19:11:10 · 951 阅读 · 1 评论 -
哈希表(散列表)详解及代码实现
散列表(Hash table,也叫哈希表),是根据关键码值(Key, value)而直接进行访问的数据结构。也就是说,它通过吧关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。原创 2017-04-19 13:52:52 · 8092 阅读 · 1 评论 -
详解初始化列表
初始化列表定义构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化列表)。初始化列表位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。Date(int year, int month, int day)//带参构造函数 :_year(year) , _month(month) , _day(原创 2017-08-08 13:01:04 · 1977 阅读 · 0 评论 -
详解C++类中的6个默认成员函数
构造函数定义成员变量为私有的,要对他们进行初始化,必须用一个共有成员函数来进行。同时这个函数应该有且仅在定义对象时自动执行一次,这时调用的函数称为构造函数(constructor)。特征:函数名与类名相同。无返回值。对象构造(对象实例化)时系统自动调用对应的构造函数。构造函数可以重载。构造函数可以在类中定义,也可以在类外面定义。如果类定义中没有给出构造函数,则C++编译器自动生成一个缺省原创 2017-08-08 12:37:43 · 391 阅读 · 0 评论 -
【排序算法】:九大排序算法总结
直接插入排序参考博客:【排序算法】:直接插入排序 时间复杂度:平均情况:O(N^2)最好情况:O(N)最坏情况:O(N^2)空间复杂度:O(1) 稳定性:稳定希尔排序参考博客:【排序算法】:希尔排序时间复杂度:平均情况:O(N^1.3)最好情况:O(N)最坏情况:O(N^2)空间复杂度:O(1) 稳定性:不稳定选择排序参考博客:【排序算法】:选择排序 时间复杂度:平均情况:原创 2017-08-14 18:27:49 · 700 阅读 · 0 评论