随笔分类 - 数据结构与算法
摘要:LinkList.h#ifndef LINKLIST_H#define LINKLIST_Htypedef int element;typedef struct ListNode{ element data; ListNode* next;}LNode;//初始化一个空链表void InitLinkList(LNode* *head);//计算链表的长度int LinkListLength(LNode* head);//插入操作:在位置i插入结点,结点数据为xbool InsertLinkList(LNode* head,int i, element x);//插入操作:在链表后依...
阅读全文
摘要:tree.h#ifndef TREE_H#define TREE_H#include <assert.h>typedef int element;/*定义二叉树*/typedef struct Node{ element data; Node* leftChild; Node* rightChild;}TreeNode;void PreOrder(TreeNode *root);//递归前序遍历void InOrder(TreeNode *root);//递归中序遍历void PostOrder(TreeNode *root);//递归后序遍历void IterationPr...
阅读全文
摘要:拓扑排序的步骤: (1)从图中选择一个入度为0的顶点且输出之; (2)从图中删掉该顶点及其所有以该顶点为弧尾的弧;反复执行这两个步骤,直到所有的顶点都被输出,输出的序列就是这个无环有向图的拓扑序列。
阅读全文
摘要:递归和非递归的二分查找://非递归二分查找算法/*list:待查找的有序数组 *key:需要查找的元素 *n:数组长度 *return:返回查找的位置下标,返回-1表示未找到 */int binarySearch(element list[], element key, int n){ int left =0; int right = n-1; int mid=0; while(left <= right)// <=,不能遗漏等于的情况 { mid=(left+right)/2; if(list[mid] == key) ...
阅读全文
摘要:归并算法的两种方法:1、使用分治法的递归归并算法:/*递归归并排序 *将有二个有序数列list[first...mid]和list[mid+1,...last]合并 *list:待排序数组 *first:子序列1的下界 *mid:子序列1的上界 *last:子序列2的上界 *temp:临时保存数组*/void Merge(element list[], int first, int mid, int last, element temp[]){ int i = first, j = mid + 1; int m = mid, n = last; int k = 0; ...
阅读全文
摘要:/*@希尔排序:分组插入排序 *@list:待排序数组 *@n:总排序元素个数 */ void shellSort(element list[], int n)//希尔排序 { int span=n; element temp; while(span > 1)//跨度为1时排序结束 { span=(span+1)/2; for(int i=0; i<n-span; i++) { if(list[i+span]<list[i]) { te...
阅读全文
摘要:/* *@list:待排序数组 *@n:总排序元素个数 */void insertSort(element list[], int n)//插入排序{ int i=0; int j=0; element next; for(i=0; i<n; i++) { next=list[i]; for(j=i-1;j>=0&&list[j]>next;j--)//j>=0且list[j]是和next比较 { list[j+1]=list[j];//后一位等于前一位 } list[j+...
阅读全文
摘要:1 /* 2 *@list:待排序数组 3 *@root:根结点下标 4 *@n:总排序元素个数 5 */ 6 void adjust(element list[], int root, int n)//调整最大堆方法一 7 { 8 int child=2*root+1;//左孩子 9 element temp;10 while(child < n)//***while*** 11 {12 if(child < n-1 && list[child]<list[child+1])//比较左右结点,得到较大的为child13 ...
阅读全文
摘要:1 //2012-07-16 2 void quickSort(element list[], int left, int right)//快速排序 3 { 4 int i=left; 5 int j=right; 6 7 if(i >= j) //判断需要i<j 8 return; 9 10 element temp=list[i];11 12 while(i<j)13 {14 while(i<j && list[j]>temp)//需要i<j15 j--;16 17 ...
阅读全文
摘要:char* strcpy(char* strDest,const char* strSrc){ assert((strDest != NULL)&&(strSrc != NULL)); char* adress=strDest;//记录strDest的首位置 while(strSrc !='\0') { *strDest++=*strSrc++;//不是strDest++=strSrc++ } return adress;//返回strDest的首位置}#define IS_FULL(ptr) (!(ptr))node* treecpy(nod...
阅读全文
摘要://快速排序一是不是在语法上注意的更多 更容易错误???//比较和体会两种算法的区别//2012年4月11日 16:39:46void quickSort(int list[],int left,int right)//快速排序一{ int i; int j; int pivot; if( left<right) { i=left; j=right+1;//以下i++,j--了一次,i是需要首先+1,但j不需要,所以此处需要提前+1,抵消 pivot=list[left]; do{ do...
阅读全文
摘要:转自:http://www.cnblogs.com/leavingq/archive/2012/01/08/2316560.html计数排序是一种运行时间在输入的某种假设情况下可以为Θ(n)的算法,它的过程中没有比较环节。基本的思路就是假设输入序列中任意的元素x都满足x∈[0, k],且x和k都为整数。然后对每一元素x,都确定出序列中比它小的元素的个数,比如为n,则x排序后的位置就应当从n + 1处开始。实现的时候还需要考虑一些细节,比如序列中有几个元素大小相等,因此还需要对大小相等的元素个数进行计数,这样才能正确分配排序后各个元素的位置。过程中用到了一个辅助序列C,C的大小为k + 1,从C
阅读全文
摘要:其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除了指针i的回溯问题,只需确定下次匹配j的位置即可,使得问题的复杂度由O(mn)下降到O(m+n)。在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀。假设主串:s: ‘s(1) s(2) s(3) ……s(n)’ ; 模式串 :p: ‘p(1) p(2) p(3)…..p(m)’继续现在我们假设 主串第i个字符与模式串的第j(j<=m)个字符“失配”后,主串第i个字符与模式串的第k(k<j)个字符继续比较此时,s(
阅读全文

浙公网安备 33010602011771号