数据结构学习
WinJourn
Stay hungry stay foolish
展开
-
堆的push,pop数组实现(挑战程序设计竞赛)
堆是形如下图的二叉树堆的最重要的性质,就是儿子的值一定不小于父亲的值。树的节点从上到下,从左到右的顺序紧凑排列。【插入数据】push 首先在堆的末尾插入数据,然后不断向上提升直到没有大小颠倒【删除数据】pop从堆中删除最小的数据先将堆中最后一个节点的值复制到根节点上,并且删除最后一个节点。然后不断向下交换,直到没有大小颠倒;在原创 2015-08-05 09:02:24 · 2518 阅读 · 0 评论 -
数据结构学习---中缀表达式转后缀表达式(c++)
当然,上面的两个算法只是纸上谈兵,数据结构的课程。第二个计算后缀表达式的方法也只能计算 个位数的多项式运算,因此这里我在给出浮点数带括号的多项式计算器。综合了上面两个算法。原创 2015-09-26 11:30:35 · 988 阅读 · 0 评论 -
快速排序的简单实现(Quick_Sort)
快速排序快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:速排序和归并排序类似,也是运用了递归的思想,通过一趟排序将要排序的数据分割成独立的两部分,每次选取一个主元(Pivot),使得主元左边的的元素都比主元小,主元右边的元素都大于主元,然后分别对主元两边再递归的调用QuickSort。步骤step1:选取主元,然后通过左右两边元素原创 2015-11-06 20:39:01 · 783 阅读 · 0 评论 -
归并排序求逆序对
归并排序求逆序对我们知道归并排序是递归的对左右两边区间排序,然后将已经有序的左边区间和右边区间合并。合并的时候,假设左边区间范围是 l 如果a[i] a[j] ,那么 所有 a[i] .. a[i+i] ... a[mid-1]这些数都是大于a[j]的,因为左边区间已经有序。所以只要每次遇到 a[i] > a[j], ans += mid - i,就能求出所有的逆序对。原创 2015-11-21 07:49:11 · 392 阅读 · 0 评论 -
二分查找(c & c++)
C++版本上面是之前C语言的版本,这里用C++再来实现,有三个版本,顺便进行效率的分析。【版本A】template <typename T> static int Binsearcha(T *arr ,int lo,int hi,T x){ while(lo < hi){ int mid = (lo + hi) >>1; if(x <arr[mid]) hi = mid; else if (arr[mid] < x) lo = mid + 1; else return mid;原创 2015-08-07 11:42:55 · 1008 阅读 · 0 评论 -
希尔排序的简单实现
希尔排序希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。既然是插入排序的改进版本,我们就先来看一看插入排序。插入排序的原理就和打牌时我们抓牌一样,每次摸到一张新的牌,我们都会将它插入到已经有序的牌序中,使之仍然有序。例如 我们原创 2015-11-06 20:20:19 · 641 阅读 · 0 评论 -
冒泡排序改进版
冒泡排序的改进普通的冒泡排序的算法的平均时间复杂度为O(n^2),通过对一些特殊情况的研究,我们得出了这个改进版的冒泡排序,所以它的时间复杂度是~,没错,还是O(n^2)!否则就叫不叫冒泡排序早就改名了冒泡排序的时间消费主要是在比较以及交换的次数上,每一趟冒泡都会将当前序列最大的数“冒”到序列的最后,然后序列缩小一个规模。不断往复。改进1如果在中原创 2015-10-20 18:22:55 · 689 阅读 · 0 评论 -
归并排序的简单实现(c++ 版本)
归并排序归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,也称为二路归并。实现首先先来实现将两个有序的子序列合并成一个有序的序列。先将归并的序列分成两个,左边的B和右边的原创 2015-10-20 22:59:25 · 1525 阅读 · 0 评论 -
二叉搜索树的简单实现(Binary Search Tree)
一、二叉搜索树的概念二叉搜索树,又称二叉排序树,二叉查找树,他能够高效的完成数据的插入,查询,删除操作,是一种高效的数据结构。如下图就是一个构建好的二叉搜索树。特点: 所有的结点,都满足左子树上的所有节点都比自己小,而右子树上的所有节点都比自己大。二、二叉搜索树的结构查找:根据上述特性,我原创 2015-09-18 19:49:42 · 3480 阅读 · 0 评论 -
数据结构学习---队列的链式储存实现
队列简单的实现了push pop empty size;和堆栈的链式实现一样,因为删除操作后需要执向下一个元素,所以队列的删除操作 pop 要在链表的头部实现因为队列是 First In First Out,所以插入操作 push 要在链表尾插入。【测试代码】#include #include#includeusing namespace std;#原创 2015-08-09 16:57:01 · 664 阅读 · 0 评论 -
数据结构学习---线性表链表实现
链表首先是结构体typedef int ElementType; //为了便于修改链表中元素的类型typedef struct Node{ ElementType Date; struct Node* Next;}List;List L,*Ptrl;求链表长度的函数int length(List *Ptrl){ List* p =Ptrl; int j=0; while原创 2015-08-08 13:28:11 · 1314 阅读 · 0 评论 -
数据结构学习---堆栈的动态数组实现及链表实现
堆栈【链表实现堆栈】优点:可以无限增添元素,只要内存足够,缺点:内存中存储位置不连续typedef int ElementType;//只能向头部插入元素,因为如果在尾部插入,删除时,找不到上一个节点///因为链表是单向的//所以 push pop 操作在头结点进行class Stack{ public: Stack(){ S=(Stack*)malloc(原创 2015-08-08 17:08:58 · 1066 阅读 · 0 评论 -
二叉树的层次遍历
输入一颗二叉树,你的任务是从上到下,从左到右的顺序输出各个节点的值。每个节点都按照从根节点到它的移动序列给出(L,表示做,R表示右)。在输入中,每个节点的左括号和右括号之间没有空格,相邻节点之间用一个空格隔开。每棵树的输入用一对空括号“()”结束。注意: 如果从根到某个节点的路径上有的节点没有在输入中给出,或者给出超过1次,应当输出 not complete ,节点个数不超过256.原创 2015-08-29 10:09:22 · 1252 阅读 · 2 评论 -
PAT 一元多项式的乘法与加法运算(链表 c++版)
题目按照指数递减的顺序给出两个一元多项式,输出两个多项式的乘积,还有 和 ,按照指数递减的顺序。用链表实现一元多项式的乘法与加法运算。首先来看加法运算多项式 poly1 x^4 + 3x^3 + 6x多项式 poly2 6x^5 + 4x^4 + 6既然用到链表,自然少不了结构体struct node{ int coef; //系数 int expn; //原创 2015-09-09 22:45:30 · 6611 阅读 · 1 评论 -
数据结构学习---链表的若干操作
在OJ上做了几道链表操作的题目,通过和别人代码的比较也修改了自己的链表,,使之尽量简洁【源代码】#include #include #include using namespace std;struct node{ int val; node *next; node(){ val = 0; next = NULL; }};node *odd,*even; //奇数表原创 2015-09-20 20:37:30 · 756 阅读 · 0 评论 -
中序遍历树(不一定是二叉树)
题目描述给一棵树,你可以把其中任意一个节点作为根节点。每个节点都有一个小写字母,中序遍历,得到一个字符串,求所有能得到的字符串的字典序最小串。因为这棵树不一定是二叉树,所以中序遍历时,先中序遍历以节点序号最小的节点为根的子树,然后再遍历根节点,最后根据节点序号从小到大依次中序遍历剩下的子树。HINT意思就是请枚举所有的点为根,然后中序遍历最后输出所有结果中字典序最小的比如说第二原创 2017-05-01 16:36:14 · 1162 阅读 · 0 评论