![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
HappyTree
计算机软件行业,爱好乒乓球
展开
-
表达式求值
几年之前因为一个表达式求值方面的问题烦恼了好几天。最终问题虽然解决了,但对于表达式求值的实现却未理解。大概是因为当初数据结构基础薄弱的缘故吧。好几年了,今天偶尔想起,决定写一个。虽说写,也不是原创,而是在别人的基础上修改而来的。放在这里,以备查阅。首先是exprcalc.h文件#ifndef _EXPR_CALC_H_#define _EXPR_CALC_H_#include sta原创 2006-12-29 21:45:00 · 1467 阅读 · 0 评论 -
经典排序算法
几种经典排序算法。说经典,是因为它们比较简单,而且基本上在任何一本数据结构的书籍上都有论述。//// 这是最原始,也是众所周知的最慢的算法了。// 他的名字的由来因为它的工作看来象是冒泡//templatetypename T>void BubbleSort(T* data, int count)...{ for (int i = 1; i count; i++) ...{原创 2007-01-09 08:47:00 · 1329 阅读 · 0 评论 -
二叉树系列之四:AVL树
AVL树是一种特殊的二叉搜索树,与红黑树相比,其平均性能略低,但最差性能要好于红黑树。其实现也主要在于插入和删除之后的调整。完整实现如下:#ifndef _AVL_TREE_H_#define _AVL_TREE_H_#include "BSTree.h"template class T>class AVLTree : public BSTreeT>...{public: AVL原创 2007-01-01 20:01:00 · 1261 阅读 · 1 评论 -
计数排序算法
计数排序是一个非基于比较的线性时间排序算法。它对输入的数据有附加的限制条件: 1、输入的线性表的元素属于有限偏序集S; 2、设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则k=O(n)。 在这两个条件下,计数排序的复杂性为O(n)。计数排序算法的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦原创 2007-01-07 12:15:00 · 2675 阅读 · 0 评论 -
快速排序算法的实现
快速排序算法是在实际应用中经常用到的排序算法。STL中的sort()算法就是使用快速排序算法。快速排序算法的平均统计性能是O(nlogn)。虽然堆排序算法的平均统计性能也是O(nlogn),但快速排序算法的系数要比堆排序的要小,因此总体统计性能要优于堆排序算法。不过,快速排序算法的最差统计性能是O(n2),要差于堆排序的O(nlogn),因此在实际应用中快速排序算法的性能太差的话,也可能使用堆排序原创 2007-01-07 09:46:00 · 2587 阅读 · 3 评论 -
二叉树系列之二:二叉搜索树
本文介绍了二叉搜索树的一些必要元素,包括:search(T key):特定键值的查找;minimum(): 树中最小键值的查找;maximum():树中最大键值的查找;successor(BTNode* x):获得x的下一节点;predeccessor(BTNode* x):获得x的上一节点;insert(T data):插入指定的键值;remove(T data):删原创 2007-01-01 19:50:00 · 1199 阅读 · 0 评论 -
最大堆及堆排序的实现
堆数据结构用于排序算法中,空间复杂度O(1),时间复杂度O(NlogN),但是在实践中还是不如快速排序(好像快速排序可以更好的利用硬件特性)。堆的意义就在于:最快的找到最大/最小值,在堆结构中插入一个值重新构造堆结构,取走最大/最下值后重新构造堆结构 其时间复杂度为O(logN),而其他方法最少为O(N).堆实践中用途不在于排序,其主要用在调度算法中,比如优先级调度,每次取优先级最高的,时间驱动原创 2007-01-07 10:15:00 · 9345 阅读 · 1 评论 -
巨整数相乘的简单实现
这是我看过的最简单的算法,思路就是我们小学学过的乘法运算。void Multiple(char A[], char B[], char C[])...{ int LenA = strlen(A), LenB = strlen(B); int Index = LenA + LenB - 1; // B is the multiplicand for (int i =原创 2007-01-02 21:33:00 · 129 阅读 · 0 评论 -
次序查找算法
有时我们需要查找某个集合里某个特定次序的元素。如果先排序然后再获得该元素,显然效率相对较低。下面是ITOA上的算法,时间复杂度为O(n)。int Partition(int* a, int p, int r)...{ int x = a[r], i = p - 1; for (int j = p; j r; j++) ...{ if (a[j] x)原创 2007-01-07 12:29:00 · 1463 阅读 · 1 评论 -
二叉树系列之三:红黑树
红黑树是一种特殊的二叉搜索树。它的实现主要是在二叉搜索树的插入和删除上进行一定的旋转操作,以维持红黑树的特性。下面是红黑树的实现:#ifndef _RB_TREE_H_#define _RB_TREE_H_#include "BSTree.h"template class T>class RBTree : public BSTreeT>...{public: RBTree(T原创 2007-01-01 19:55:00 · 1308 阅读 · 0 评论 -
二叉树系列之一:二叉树
二叉树系列包括二叉树基类、二叉搜索树、红黑树以及AVL树。这里先讨论二叉树基类。先看BTNode类的定义template class T>struct BTNode...{ BTNode(T d, COLOR c = RED, BF f = NORMAL, BTNode* l = nil_, BTNode* r = nil_, BTNode* p = nil_)原创 2007-01-01 19:39:00 · 1145 阅读 · 0 评论 -
如何删除链表节点
题目是这样的:一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?有关链表的面试题在技术面试中是很常见的。因为链表在数据结构中是很基本的结构,另外,链表经常会使没有扎实掌握的人陷入误区。就以这道题为例,没有一定的基础,感觉无从下手。但如果理解了链表在内存中的存储方式,找到解决办法也是不难的。解决方案:将这个指针指向的next节点值copy到本节点原创 2007-05-19 06:57:00 · 12701 阅读 · 5 评论