
数据结构
weizhengbo
开始我的IT之旅!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
递归和尾递归
递归和尾递归一、递归:若一个对象部分地包含它自己或者用它自己给自己定义,则称这个对象是递归的;若一个过程直接地或者间接地调用自己,则称这个过程是递归的过程。1、递归的思想:把问题分解成规模更小的具有与原问题具有相同解法的问题。2、递归条件:(1)缩小问题规模,使新问题与原问题具有相同的解决形式。(3)设置递归的出口(存在简单场景,可以使递归在简单场景下退出)。例原创 2017-04-15 16:58:41 · 486 阅读 · 0 评论 -
快速排序的三种实现以及应用场景
好了,废话不多说,直接上干货。 1、快速排序的概念: 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Horno在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 2快速排序原创 2017-08-27 10:41:54 · 12856 阅读 · 1 评论 -
归并排序的点点滴滴
一、归并排序:是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;原创 2017-07-12 21:41:44 · 308 阅读 · 0 评论 -
快速排序的点点滴滴
好了,废话不多说,直接来干货。首先说下快速排序的思想,一般网上说的都是Horno(Horno这个人提出来的算法)法,我这里除此之外还介绍另外的两种方法。//way1:Horno 法1、找一个基准值key(一般三数取中法),本题中基准值为数组中最右的元素,再定义两个指针begin(指向首元素)和end(指向尾元素)2、begin从前往后走找比基准值key大的元素(找到后停下),end从后往前走原创 2017-08-06 17:41:51 · 258 阅读 · 0 评论 -
求单链表的差集
“` //并将结果保存在集合A的单链表中。例如,若集合A = { 5, 10, 20, 15, 25, 30 },集合B = { 5, 15, 35, 25 }, //完成计算后A = { 10, 20, 30 }。 //解题思路:一个链表中的每个节点去另一个链表中找,删除相同的结点,留下的则是 不同的结点 /* 本题的解法思路较简单: 因为要求集合A和集合B的差集(A - B),结果保原创 2017-07-26 23:19:14 · 1403 阅读 · 1 评论 -
二叉树的各种遍历
// 前序:访问根节点--->访问根节点的左子树--->访问根节点的右子树 void _PreOrder(Node* pRoot) { if (pRoot) { cout << pRoot->_value << " "; _PreOrder(pRoot->_pLeft); _P原创 2017-07-26 23:12:58 · 277 阅读 · 0 评论 -
对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间。原数组为:A,B,C,D,E, 现给定新的位置为3, 0, 1, 4, 2那么排序为D,A,B,E,C
题目描述:对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间。例如:原数组为:A, B, C, D, E, 现给定新的位置为:3, 0, 1, 4, 2,那么排序后为D, A, B, E, C。问题分析:为什么分类为数据结构,因为其实这个题就是快排的挖坑法的变形。解决思路:保存第一个位置的数据后,把第一个位置设为坑,如果给定的新位置与现在ind原创 2017-07-16 18:06:16 · 965 阅读 · 0 评论 -
判断链表是否带环?若带环求环的长度?若带环求环的入口点?
//判断链表是否带环思路://定义两个指针,一个快指针(快指针一次走两步),一个慢指针(慢指针一次走一步),快慢指针同时//出发,若快慢两指针相遇,则链表带环,否则,不带环//求带环求环的长度思路://若链表带环,则快慢指针有相遇点,求得相遇点,在定义一个指针,从相遇点出发再回到相遇点所走的路程就是环的长度//求单链表中环的入口点//思路:根据推到出来的公式://结论:快慢指针碰撞点到原创 2017-07-16 22:31:55 · 442 阅读 · 0 评论 -
模拟实现循环队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。进行插入操作的一端称为队尾,通常称为入队列;进行删除操作的一端称为队头,通常称为出队列。队列具有先进先出的特性(FIFO)。循环队列:将头尾相接的顺序存储队列称为循环队列。
#pragma once#include<iostream>#include<windows.h>#include<string.h>#include<queue>#include<stack>using namespace std;// 孩子表示法template<class T>struct BinaryTreeNode{ BinaryTreeNode(const T&原创 2017-05-18 02:25:23 · 257 阅读 · 0 评论 -
让你彻底理解红黑树
/*首先呢,按照套路,介绍一下什么是红黑树?一、定义:红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是red或者black,通过对任何一条从根节点到叶子结点上的简单路径来约束,红黑树保证最长路径不超过最短路径的两倍,因而近视平衡。然后呢,我么就看一下红黑树有哪些性质呢?二、性质:1. 每个结点不是红色就是黑色2. 根节点是黑色的3. 如果一个根节点是原创 2017-05-27 17:20:31 · 370 阅读 · 0 评论 -
模拟实现栈
**模拟实现栈**#include<iostream>#include<windows.h>#include<stack>using namespace std;template<class T>class Stack{public: Stack(size_t capacity = 5) { _capacity = capacity+3;//防止传NU原创 2017-04-23 13:53:06 · 257 阅读 · 0 评论 -
对称矩阵压缩存储
压缩矩阵:对称矩阵存储时只需要存储上三角或下三角的数据,所以最多存储n*(n+1)/2个数据。对称矩阵和对称压缩存储的对应关系:下三角存储i>=j,SymmetricMatrix[i][j] == Array[i*(i+1)/2+j]//压缩存储矩阵templateclass Square{public:Square(T *arr,size_t N):_row(N)原创 2017-04-22 20:46:17 · 1195 阅读 · 0 评论 -
数组系列面试题
以下是我总结的关于高频率数组系列的面试题,如有不足之处,希望大家指出#include<iostream>#include<windows.h>#include<vector>using namespace std;#include<string.h>#include<sstream>#include <algorithm>/************************求数组中出现次原创 2017-09-01 20:58:21 · 1065 阅读 · 0 评论