(归并排序)
摘要:归并排序 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即
阅读全文
判断一颗二叉树是否是平衡二叉树
摘要:1.问题描述: 判断一颗二叉树是否是平衡二叉树。2.问题分析: 平衡二叉树要求左子树和右子树的高度相差为1,且左右子树都是平衡二叉树,显然需要计算二叉树高度的函数。3.代码:templateint DepthTree(BSTreeNode *pbs){ if (pbs==NULL) return 0; else { int leftLength=DepthTree(pbs->left); int rigthLength=DepthTree(pbs->right); return 1+(leftLength>rigthLength ? leftLength:rigthLengt
阅读全文
直接插入排序基本思想
摘要:下一页 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。 本节介绍两种插入排序方法:直接插入排序和希尔排序。直接插入排序基本思想1.直接插入排序的基本思想 直接插入排序(Straight Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。把a[i]插入到a[0..
阅读全文
插入排序
摘要:#include <stdio.h>#include <stdlib.h>void PrintHeap(const char* strMsg,int array[],int nLength);void InsertionSort1(int *items, int count) void InsertionSort2(int a[],int size);void PrintArray(const char* strMsg,int array[],int nLength);int main(int argc, char *argv[]){ int data[13]={8,5
阅读全文
已知二叉树的中序遍历和前序遍历,如何求后序遍历 .
摘要:(昨晚HULU的笔试题之一,被鄙视的惨,面对向往已久的公司,交出苍白无力的答卷,心里像被剜了一刀。再多解释都是苍白。我鄙视我自己。现在开始舔舐伤口。)假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道。PreOrder: GDAFEMHZInOrder: ADEFGHMZPostOrder: AEFDHZMG现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”应该如何求后续遍历?第一步,root最简单,前序遍历的第一节点G就是root。第二步,继续观察前序遍历GDAFEMHZ,除了知...
阅读全文
链表的常见操作(基础)
摘要:链表是数据结构的重要内容,在计算机程序中应用广泛,同时也是各公司笔试题目的重点。 以下简单实现了链表的一些操作,包括创建、增加节点、删除节点、单链表逆置、合并有序链表等。一、链表创建 链表主要有三种形式,包括单链表、双链表和循环链表。 单链表每个节点只包含一个后驱指针,双链表节点同时包含一个前驱指针和一个后驱指针,循环链表的尾节点的后驱指向头节点。 代码如下:/*单链表节点结构*/typedef struct NodeType{char elem;NodeType*next;}Node;/*双链表节点结构*/typedef struct DNodeType{char elem;DNod...
阅读全文
链表的常见操作
摘要:链表是数据结构的重要内容,在计算机程序中应用广泛,同时也是各公司笔试题目的重点。以下简单实现了链表的一些操作,包括创建、增加节点、删除节点、单链表逆置、合并有序链表等。一、链表创建 链表主要有三种形式,包括单链表、双链表和循环链表。 单链表每个节点只包含一个后驱指针,双链表节点同时包含一个前驱指针和一个后驱指针,循环链表的尾节点的后驱指向头节点。 代码如下:/*单链表节点结构*/typedef structNodeType{ char elem;NodeType*next;}Node;/*双链表节点结构*/typedef structDNodeType{char elem;DNodeTy...
阅读全文
数组仿真堆栈与链表仿真堆栈(内含数组与链表的差别)
摘要:数组和链表其实都能很好的完成这项任务,唯一不同就是,仿真入栈操作时,数组必须提前给出栈的大小,而链表可以使栈的大小实现动态变化,节省内存...其实也就是数组和链表本身的区别了:数组: 优点:查找速度快缺点:大小固定,不适合动态存储,不方便动态添加。链表:与数组相反。优缺点互换。再详细点可以从下面两个方面说:1、从逻辑结构来看 数组必须事先定义元素个数,不能适应数据动态地增减的情况,当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项,而数组比较麻烦的... 2、 从内存存储来看...
阅读全文
用链表仿真的堆栈存储
摘要:#include<stdlib.h>#include<stdio.h>struct node{ int data; struct node *next;};typedef struct node list;typedef list *link;link stack=NULL;//打印堆栈数据void print_stack(){link temp=NULL;temp=stack; if(temp==NULL) printf("\nthe stack is empty!!\n");else { while(temp!=NULL) ...
阅读全文
链表程序
摘要:#include<stdio.h>#include<malloc.h>#include<stdlib.h>//定义链表节点typedef struct Node{ int data; //数据域 struct Node * pNext; //指针域}NODE, * PNODE; //NODE等价于struct Node, PNODE等价于struct Node *//函数声明PNODE createLinkList(void); //创建链表的函数void traverseLinkList(PNODE pHead); //遍历链表的函数bool isEmpt
阅读全文
链表的创建方法归纳
摘要:链表在创建是可以通过开头创建也可以通过(由后向前创建)下面主要是由后创建的方法实现 p=NULL;while(i==n) { q=(link*)malloc(sizeof(node)); q->next=p; p=q; i++; }return p;
阅读全文
双向循环链表程序(C语言版)
摘要://dblist.h#include <stdio.h>#include <stdlib.h>typedef struct tagDbNode{ int data; struct tagDbNode * left; struct tagDbNode * right;} DbNode, * pdbNode;//创建结点pdbNode CreateNode(int data){ pdbNode pnode = (pdbNode)malloc(sizeof(DbNode)); pnode->data = data; pnode->left = pnode->
阅读全文
一步一步写算法(之双向链表)
摘要:前面的博客我们介绍了单向链表。那么我们今天介绍的双向链表,顾名思义,就是数据本身具备了左边和右边的双向指针。双向链表相比较单向链表,主要有下面几个特点: (1)在数据结构中具有双向指针 (2)插入数据的时候需要考虑前后的方向的操作 (3)同样,删除数据的是有也需要考虑前后方向的操作 那么,一个非循环的双向链表操作应该是怎么样的呢?我们可以自己尝试一下: (1)定义双向链表的基本结构typedef struct _DOUBLE_LINK_NODE{ int data; struct _DOUBLE_LINK_NODE* prev; struct _DOUBLE_LINK_NOD...
阅读全文
双向链表的C实现
摘要:双向链表需要定义一个结构体,结构体有3个属性typedef struct __Node{ int data; 数据 struct __Node *pre; 指向前一个结点指针 struct __Node *next; 指向下一个结点指针}Node;其中 pre和next指针是嵌套定义。一般链表定义一个头指针Node *head;指向链表第一个结点,如果链表为空的话,那么head == NULL。双向链表一般分为init,insert, delete, search, destroy等几种操作1、init初始化:将头指针head置为NULL即可2、insert插入:这里我只实现了在表头位置插入新
阅读全文
自己的链表创建插入输出删除程序
摘要:#include<stdlib.h>#include<stdio.h>#define max 10struct list { int data; struct list *next; }; //定义结构体typedef struct list node; //结构体的变量typedef node* link; //结构体指针//链表输出函数的实现方式void link_output(link new) { link ...
阅读全文
如何计算时间复杂度
摘要:定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。此外,一个问题本身也有它的复杂性,如果某个算法的复杂性到达了这个问题复杂性的下界,那就称这样的算法是最佳算法。“大 O记法”:在这种描述中使用的基本参数是 n,即问题实例的规模
阅读全文