数据结构与算法
两榜进士
if you are not inside,you are outside.
展开
-
常用的算法设计方法
算法设计与分析是计算机科学的核心问题。常用的算法设计方法有:•穷举法Ø将问题空间中的所有求解对象一一列举出来,逐一分析、处理,并验证结果是否满足给定的条件。(例:C++switch语句)•回溯法Ø将问题的候选解按某种顺序逐一枚举和检验,来寻找一个满足预定条件的解。当发现当前候选解不可能是解时,就退回到上一步重新选择下一个候选解(回溯)。(例:八皇后、迷宫、深度优先搜索)原创 2012-06-03 12:50:09 · 1115 阅读 · 0 评论 -
单链表
单链表逆序算法:分析: 1). 若链表为空或只有一个元素,则直接返回; 2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继; 3). 重复2),直到q为空 4). 调整链表头和链表尾示例:以逆序A->B->C->D为例,图示如下 #includeusing namespace std;class node{pub原创 2012-10-25 16:25:11 · 498 阅读 · 0 评论 -
双链表的插入与删除
定义双链表的节点class node{public: int data; node * prev; node * next;} 双链表的插入操作new q;q->data=newValue;q->next=p->next;//p为插入节点q->prev=p;p->next=q;q->n原创 2012-06-04 21:19:17 · 743 阅读 · 0 评论 -
顺序栈
#include using namespace std;class arrStack{private: int mSize; int top; int * st;public: arrStack(int size){ mSize=size; top = -1; st=new int [mSize]; } ~arrStack(){delet原创 2012-06-06 18:40:52 · 690 阅读 · 0 评论 -
表达式求值
前缀表达式:+23中缀表达式:2+3后缀表达式:23+ 后缀表达式求值:(1)如果遇到一个操作数,则压入栈。(2)如果遇到一个运算符,就从栈中弹出两个操作数,按照运算符对这两个操作数进行相应的运算,然后将结果压入栈中, 如此继续,知道遇到符号 “=”,此时栈顶的值就是输入表达式的值。原创 2012-11-06 14:47:34 · 440 阅读 · 0 评论 -
队列
队列(queue):插入和删除在不同端进行的线性表。队尾(rear):添加新元素的一端。队首(front):删除元素的一端。时间有序表:先进先出(FIFO) 特征的线性结构。队空:front=0;rear=-1;插入A元素:front=0;rear=0;队列满:rear=MaxSize-1空队列:front==rear;入队列:sq[++re原创 2012-06-08 18:00:03 · 508 阅读 · 0 评论 -
直接插入排序
思想: 利用有序表的插入操作进行排序有序表的插入: 将一个记录插入到已排好序的有序表中,从而得到一个新的有序表。直接插入排序算法描述初始,令第1 个元素作为初始有序表;依次插入第2 ,3 , …,k 个元素构造新的有序表;直至最后一个元素;直接插入排序算法主要应用比较和移动两种操作。void InsertSort(int Array[], int n){原创 2012-06-09 15:48:27 · 402 阅读 · 0 评论 -
二叉树
(1)二叉树基本特征:•① 每个结点最多只有两棵子树(不存在度大于2的结点)•② 左子树和右子树次序不能颠倒。下面是两棵不同的树:l结点的层次:根结点的层数为0,根的孩子层数为1,依此类推。l二叉树深度:树中结点的最大层次。l二叉树的高度:层数最大的叶结点的层数加1。满二叉树和完全二叉树满二叉树:棵二叉树的任何结点,或者是树叶,或者恰有两棵非空子树,原创 2012-06-09 13:04:32 · 545 阅读 · 0 评论 -
快速排序
快速排序的主要思想是:(1)从待排序序列S中任意选择一个记录K作为轴值(pivot)。(2)将剩余记录分割成左子序列 L 和右子序列 R 。(3)L中所有记录都小于或等于K,R中记录都大于等于K,因此K正好位于正确位置。(4)对子序列L和R递归进行快速排序,知道子序列中只含有0个或1个元素,退出递归。 template void quick_sort2(T *a, i原创 2012-06-10 22:08:12 · 407 阅读 · 0 评论 -
冒泡排序
思想: 通过不断比较相邻元素大小,进行交换来实现排序。第一趟排序:首先将第一个元素与第二个元素比较大小,若为逆序,则交换;然后比较第二个元素与第三个元素的大小,若为逆序,则交换;直至比较第n-1个元素与第n个元素的大小,若为逆序,则交换;结果:关键字最大的记录被交换至最后一个元素位置上。•优点: 每趟结束时,不仅能挤出一个最大原创 2012-06-10 15:47:09 · 437 阅读 · 0 评论 -
归并排序(Merge Sort)
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。//将有序数组a[]和b[]合并到c[]中void Memery转载 2012-06-11 14:39:58 · 440 阅读 · 0 评论 -
栈
栈:限定仅只能在末端进行插入和删除的线性表。栈顶:允许插入和删除的一端。栈底:不允许插入和删除的一端。时间有序表:先进后出(FILO) /后进先出(LIFO)特征的线性结构。空栈: top == -1 template class Stack{public: Stack(int MaxStackSize=10); ~Stack()原创 2012-06-05 16:35:03 · 402 阅读 · 0 评论 -
排序的平均时间复杂度和稳定性
不稳定排序:直接选择排序,希尔排序,快速排序,堆排序平均时间复杂度:n *log n:快速排序,归并排序,堆排序n*n:直接插入排序,冒泡排序,直接选择排序希尔排序:n^1.3桶式排序:n+m原创 2012-06-25 11:53:58 · 1080 阅读 · 0 评论 -
设计一个算法,删除一个顺序表中从第i个元素开始的k个元素。
#include using namespace std;class arrList{private:int* aList;int curLen;//顺序表的当前长度public:int maxSize;//顺序表的实例的最大长度void set(const int size){maxSize=size;aList=new int[maxSize原创 2012-06-04 20:39:00 · 14291 阅读 · 1 评论 -
不开辟新空间,两个有序单链表合并为一个有序单链表
/*链表*/#include typedef struct node{ int data; struct node *next;}*Listlink;/*后插法创建单链表*/void hou_create(Listlink *head,int n){ int i; Listlink p,q; *head=(Listlin翻译 2012-06-04 15:39:56 · 2797 阅读 · 1 评论 -
时间复杂度的比较
•算法分析中常见的复杂度O(1) O(lgn) O(n) nlgn) 2)3)n) nn)常数 对数 多项式 指数原创 2012-06-03 13:10:00 · 7109 阅读 · 1 评论 -
双链表
双链表 节点类templateclass DLLNode{public:T data;DLLNode *next, *prior;DLLNode(){ next=prior=0; }DLLNode(const T& el,DLLNode *n=0, DLLNode *p=0){ data=el; next=n; prior=p; }};双链表类tem原创 2012-06-04 16:08:50 · 2573 阅读 · 0 评论 -
单链表
单链表 :数据域, 指针域typeof struct LNode{elemtype data;struct LNode * next;}Node,* nodeList;优点:插入,删除非常方便;缺点:不可以直接获取长度;操作:1.插入:在p点之后插入元素ss->next=p->next;p->next=s;2.删除:删除p点之后的一个元素q=p-原创 2012-06-04 14:20:36 · 532 阅读 · 0 评论 -
简单模式匹配算法
•算法设计思想:•将主串S的第pos个字符和模式T的第1个字符比较,–若相等,继续逐个比较后续字符;–若不等,从主串S的下一字符(pos+1)起,重新与T第一个字符比较。 •直到主串S的一个连续子串字符序列与模式T相等。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。•否则,匹配失败,返回值 0 .int Find(char*target, ch原创 2012-06-08 19:59:02 · 3012 阅读 · 0 评论 -
分隔符匹配
题目要求:分隔符匹配(){} []main.cpp#include#include#include"Stack.h"#includeusing namespace std;int ifdelimiter(char a){if(a=='('||a=='['||a=='{')return 1;elseif(a==')'||a==']'||a=='原创 2012-06-08 13:49:25 · 455 阅读 · 0 评论 -
稳定排序与不稳定排序
稳定排序与不稳定排序假设Ki = Kj ,且排序前序列中Ri 领先于Rj ;若在排序后的序列中Ri 仍领先于Rj ,则称排序方法是稳定的。若在排序后的序列中Rj 仍领先于Ri ,则称排序方法是不稳定的。例,序列 3 15 8 8 6 9若排序后得 3 6 8 8 9 1原创 2012-06-09 15:01:29 · 1354 阅读 · 0 评论 -
图
图: 结点之间的关系可以是任意的,即图中任意两个数据元素之间都可能相关。图 G是由两个集合顶点集V(G)和边集E(G)组成的,记作G=( V(G),E(G) ),简称G=(V,E)。无向图: 边是顶点的无序对,即边没有方向性。( v1 , v2 )表示顶点 v1 和 v2 之间的边,( v1, v2) = ( v2, v1)。原创 2012-06-17 15:13:23 · 460 阅读 · 0 评论 -
MD5加密大小写问题
1、MD5加密源代码: public static void main(String[] args) { String aa = "aa"; String bb = "Aa"; System.out.println("MD5.MD5(aa) = " +MD5.MD5(aa)); System.out.println("MD5.MD5(bb) ...原创 2018-07-17 10:06:13 · 17505 阅读 · 1 评论