常见数据结构整理
司徒公子
欢迎关注微信公众号:司徒公子
展开
-
快速排序算法
快速排序是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的所有值比另一部分记录的所有值小,则可以分别对这两个部分继续进行排序,最后达到整个序列是有序的。 快速排序的具体操作要用到归并的思想然后加上递归的操作方式就可以实现了,关于具体的操作过程下面用一个图来解释下j进行一趟操作的结果: 相信大家都迫不及待的想知道用代码怎么实现的吧! 下面原创 2016-04-02 11:54:30 · 336 阅读 · 0 评论 -
最大上升子序列(LIS)
最大上升子序列问题有两种解法: 1.运用了DP的思想,当要判断第n个位置的最大上升子序列时要将n前面的数全部遍历一遍然后比较前面节点当前面节点的上升子序列+1大于当前节点的上升子序列则更新,时间复杂度为n*n。 代码如下: #include // DP using namespace std; #define N 40010 int dp[N]; int data[N]; int ma原创 2016-04-02 23:01:42 · 467 阅读 · 0 评论 -
lower_bound()和upper_bound()的简单讲解
前几天复习二分然后百度了下lower_bound()和upper_bound()函数,现在将我的理解说下,先贴出我写的代码! #include using namespace std; int lower_bound(int *a, int n, int value) //二分查找第一个大于或等于value的下标key { int l = 0; int r = n - 1; while (原创 2016-03-12 13:41:02 · 5436 阅读 · 0 评论 -
链表的创建
链表与数组的优缺点: 1.相比于链表,数组这个概念我们更加熟悉,数组在内存空间中是连续的一段地址,并且定义简单,访问元素效率极高,为O(1),但是对于增、删和插入操作就很不方便。 2.链表在内存空间中不一定是连续的,不要求连续空间故空间利用率很高,对于增、删和插入操作效率极高,但对于查找和搜索操作效率就不高了。链表的应用范围很广,许多树、链接表的结构就是用链表实现的。原创 2016-04-07 00:21:55 · 360 阅读 · 0 评论 -
链表的反转
LinkedList ReverseList(Node *head) { Node *NewHead = NULL; Node *p1, *p2, *tmp; if(head == NULL) return NULL; if(head) { p1 = head; p2 = head->next; }原创 2016-04-07 22:13:36 · 294 阅读 · 0 评论 -
希尔排序
希尔排序也属于插入排序的一种,但在时间效率上有较大改进。它的基本思想是:先设置一个增量,每次从左将相隔增量的位置的值有序,就是使用的插入法排序,然后将增量一步一步缩小,最后一步必须缩小到1。增量为n/2 n/4 n/8 ......1时的效率较高。 //shell 排序算法 #include #include #include using namespace std;原创 2016-04-14 22:21:53 · 262 阅读 · 0 评论 -
RMQ算法
1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。 2.RMQ算法 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大转载 2016-05-07 21:13:03 · 312 阅读 · 0 评论 -
两个栈实现队列操作
最近看了个面试的帖子讲的是“怎么用两个栈来实现队列的操作”,好奇的我也想试下这道题目,咋一看这道题目挺简单的呀,嗯,确实不难。先简单讲下我第一眼看到这个题目时想到的解法。讲解法之前先给大家讲下数据结构中的栈和队列吧,免得有的人不明白栈和队列,那就没办法继续看下去了。 栈(stack)(wiki) 我们经常会在面试中听到“栈”这个词语,理解这个概念对于理解程序的运行至关重要。栈这个词语在不同的语境中...原创 2019-03-18 12:41:07 · 148 阅读 · 0 评论