
数据结构
文章平均质量分 75
饭饭yes
初学者
展开
-
用两个队列实现一个栈
本来画了图的,可是今天传上来的图片都看不了,只能默默敲下来了思路:队列s1和队列s2Push进来的元素压入非空队列Pop操作之后的元素放在空队列入栈:(1)s1为空,s2为空 把所有数据压入s1中(2)s1为空,s2不为空 数据压入s2(3)s1不为空,s2为空 数据压入s2出栈:(1)s2为空 把s1中除了队头的元素全部压入s2原创 2016-05-28 16:10:13 · 239 阅读 · 0 评论 -
二叉树的中序、先序、后序、层序遍历 & 二叉树的深度 & 节点查找
二叉树的先序、后序、中序、层序遍历&二叉树的深度&节点查找原创 2016-07-04 16:09:37 · 496 阅读 · 0 评论 -
不使用库实现队列的基本操作
templatetypenameT>structNode{public: Node(constT&d) :_data(0) , _next(NULL)原创 2016-07-04 15:44:13 · 373 阅读 · 0 评论 -
不使用库实现栈的基本操作
templatetypenameT>classStack{public: Stack() :_a(NULL) , _size(0) , _cap原创 2016-07-04 15:43:07 · 325 阅读 · 0 评论 -
快速排序的实现--挖坑法
//*********************挖坑法(快排的一种实现方式)************************intPartSort(int*a,intleft,intright){ intkey =a[right]; intbegin =left;原创 2016-07-03 21:03:11 · 1678 阅读 · 0 评论 -
快速排序的优化--三数取中法
//*********************三数取中法(快排的优化)****************************//未优化|我们总是把数组尾元素固定为key的值,然后通过调整让key回到它正确的位置//前快排|然后以key为中心,把数组划分为key左边和key右边两个区域,然后继续在左边//的缺陷|和右边划分区域,直到最后区域里没有元素或者只有一个元素的时候,排序结束原创 2016-07-03 21:00:39 · 5788 阅读 · 2 评论 -
快速排序的递归写法
//*****************************快速排序(递归)****************************//递归思想:单趟来说,begin找比key大的,end找比key小的,当各自都找到的时候,// 若begin比end小,则交换两个数据,然后继续找,当再找到的时候,如果// begin比end大,则比较a[begin原创 2016-07-03 20:56:34 · 573 阅读 · 0 评论 -
希尔排序
//*****************************希尔排序****************************//思路:把数据分为几组,每组有gap个数据,gap可以是固定的,也可根据// 数组的大小来变动,做法和插入排序一样,只是每次数据后移时要后移// gap个位置,end--的时候也要移动gap个位置//NOTE:end+gap不能超过数组原创 2016-07-03 20:54:12 · 245 阅读 · 0 评论 -
插入排序
思路写的比较少,不太懂的可以看后面的图//************************插入排序****************************//思路:看每个数据的位置十分正确,如要排从小到大的数,则要看它后面的数是否比当前数据大voidInsertSort(int*a,size_tsize){原创 2016-06-11 20:44:47 · 261 阅读 · 0 评论 -
选择排序
//*****************************选择排序****************************//NOTE:当无序区间只有一个数时,已排好序voidSelectSort(int*a,size_tsize){ assert(a); for(intinde原创 2016-06-12 17:52:46 · 240 阅读 · 0 评论 -
各种排序算法的稳定性和时间复杂度小结
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。 冒泡法: 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: 复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。直接插入排序:O(n*n)选择排序:O(n*n)快速排序:平均时间复杂度log2(n)*n,所转载 2016-06-13 14:42:23 · 358 阅读 · 0 评论 -
面试题:给40亿个不重复的无符号整数,没排过序,给一个无符号整数如何快速判断这个数是否在这40亿个数中
//**********************位图***********************//腾讯面试题:// 给40亿个不重复的无符号整数,没排过序,给一个无符号整数如何// 快速判断这个数是否在这40亿个数中//解题思路://(1)直接存进内存//40亿个无符号数,如果放到内存,就需要开辟4*4G=16G的空间,因为数的范围不确定,所以//开辟尽可能大的空间来存放,需42亿9千万×4字原创 2016-06-11 11:58:02 · 5464 阅读 · 0 评论 -
对堆栈的认识
什么是堆和栈,它们在哪儿?问题描述编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什么是栈,但是它们到底是什么,在哪儿呢(站在实际的计算机物理内存的角度上看)? 1、在通常情况下由操作系统(OS)和语言的运行时(runtime)控制吗? 2、它们的作用范围是转载 2016-06-10 11:40:05 · 282 阅读 · 0 评论 -
建大堆实现优先级队列
建大堆实现优先级队列,优先级为从大到小建小堆实现的优先级队列,优先级为从小到大****************************************************************************************************本文章中写建大堆实现优先级队列//******************************大堆**原创 2016-06-05 17:15:14 · 459 阅读 · 0 评论 -
堆排序
建大堆实现的是从大到小的排序若要从小到大排序,则建小堆//******************堆排序***************************void_AdjustDown(int*a,size_t size,intparent){ intchild =parent* 2 + 1;原创 2016-06-05 17:25:05 · 230 阅读 · 0 评论 -
100w个数中找出最大的前k个数
//*******************100w个数中找出最大的前k个数***************************//挨个遍历排序:100w个数太多,内存不够,而且遍历排序效率太低//建大堆:只能选出最大的那个数//可选方案:建K个数的小堆// 首先取这100w个数中的前K个数建立最小堆,即长度为K的数组的首元素为最小的元素//原创 2016-06-05 17:19:57 · 1359 阅读 · 1 评论 -
查找字符串中第一个出现只出现一次的字符
//*****************查找字符串中第一个出现只出现一次的字符******************//方法一:从头开始扫描这个字符串中的每个字符,当访问到某字符时拿这个字符和后面的每个字符// 相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符,时间复杂度O(n*n)//方法二:利用哈希表存储字符出现的次数,第一次扫描数组时,每碰到一个字符,在原创 2016-06-05 17:13:53 · 983 阅读 · 0 评论 -
用两个栈实现一个队列
思路:栈s1和栈s2,s1用来Push数据,s2用来Pop数据入队:数据直接压入栈s1中出队:若s2为空,则把s1中除过最后一个压入的元素全部移入s2中,然后弹出s1的栈顶元素 若s2不为空,直接弹出s2的栈顶元素#define _CRT_SECURE_NO_WARNINGS 1#include#include#includeusing namespace std;templ原创 2016-05-28 16:10:10 · 208 阅读 · 0 评论 -
平衡二叉树:左单旋&右单旋&左右单旋&右左单旋 遇到的问题&解决方法
为什么要引入旋转这一说法呢?因为在建立平衡二叉树,插入二叉树节点的时候,如果发现平衡因子不是-1,0,1的时候就会进行调整,而平衡因子是判断一个二叉树的每层是否平衡的数据在进程调制的时候就会有左单旋,右单旋,左右旋转,右左旋转,通过这四种旋转来使得不管插入多少数据都可以保持平衡二叉树的特点对着四种旋转方式,我们以图的方式来进行理解:(图中的节点标记单词用于理解源代码)原创 2016-07-06 15:13:03 · 2976 阅读 · 2 评论