
算法
文章平均质量分 64
Chen_Hulk
不积跬步,无以至千里;不积小流,无以成江海。
展开
-
排序算法--冒泡法
冒泡法原理是遍历文件,如果相邻的两个元素大小不符合预期,则进行交换,重复直到有序为止。第一遍时,当遇到最小的元素时,将其与左边的元素逐个交换,直到将最小的元素移到队列的最左边。第二遍时,将第二小的元素放到队列左边的第二位中............void bubb(int a[],int n){ int i,j=0; for(i=0;i<n-1;i++)//n个元素,只需要n-1趟冒...原创 2018-04-16 19:44:46 · 14744 阅读 · 3 评论 -
优先队列与堆排序(一)
优先队列:优先队列时一种数据结构,其数据项中带有关键字,支持两种基本操作:向优先队列中插入一个新的数据项;删除优先队列中的关键字最大的数据项;优先队列数组实现:将记录存储在一个无序数组中,从数组的末尾插入和删除数据项。static Item *pq;static int N;void PQinit(int maxN){ pq = malloc(maxN * sizeof(It...原创 2018-06-11 20:24:16 · 319 阅读 · 0 评论 -
平衡树(三)自顶向下2-3-4树与红黑树
定义:一棵2-3-4搜索树是一棵或者为空,或者由以下三类节点组成的树:2-节点,具有一个关键字,一个指向带有较小关键字的一棵树的左链接,一个指向带有较大关键字的一棵树的右链接。3-节点,具有两个关键字,一个指向带有较小关键字的一棵树的左链接,一个指向带有该节点两个关键字定义区间之间的关键字值的一棵树的中链接以及一个指向带有较大关键字的一棵树的右链接。4-节点,具有三个关键字和四个链接,对于该节点的...原创 2018-06-18 21:13:15 · 730 阅读 · 0 评论 -
抽象数据类型ADT(栈与队列)
抽象数据类型 abstract data type,ADT:指只通过接口进行访问的数据类型,我们将那些使用ADT的程序叫做客户,将那些确定数据类型的程序叫做实现。数据的表示和实现操作函数都在接口的实现里面,和客户完全分离。接口对于我们来说是不透明的:客户不能通过接口看到方法的实现。优点:将编程时对数据的概念转换从任何特定的数据表示和算法实现中分离出来。使用抽象机制可以让我们关心程序如何实现的细节上...原创 2018-06-04 19:38:28 · 3597 阅读 · 2 评论 -
递归与树(三)
图的遍历:深度优先搜索从任意节点开始,访问v。(递归的)访问每一个依附于v的(未访问过的)节点。如果图是连通的,我们最终可以到达所有的节点。深度优先搜索递归实现:要访问图中与节点k相连的所有节点,我们将它标记为访问过的,然后递归的访问k的邻接表中所有未访问过的节点。void traverse(link k,void (*visit)(int)){ link t; (*visit)(k)...原创 2018-06-07 21:21:23 · 202 阅读 · 0 评论 -
平衡树(一)伸展BST
思想:通过执行两次旋转操作,把节点从作为根的孙子节点之一的位置带到树的顶部。首先,执行一次旋转,将该节点成为根的一个孩子节点。接着,执行另一次旋转,使它成为根。根据从根到插入节点的两个链接是否已相同方式定向,存在4种不同的情况:左--左:从根处右旋转两次。左--右:在左孩子进行左旋转,然后在根进行右旋转。右--右:在根处左旋转两次。右--左:在右孩子进行右旋转,然后在根进行左旋转。程序:void ...原创 2018-06-13 21:02:08 · 184 阅读 · 0 评论 -
平衡树(一)随机化BST
思想:当我们把一个新节点插入的N个节点的树中时,新节点出现在树根的概率是1/(N+1),因而我们就随机决定用这个概率进行根插入。否则,我们递归的使用下述方法插入新纪录:如果该记录的关键字小于树根的关键字,就把记录插入到左子树中;如果该记录的关键字小于树根的关键字,就把该记录插入到右子树中。程序实现:link insertR(link h,Item item)//item 插入树 h { ...原创 2018-06-13 20:10:52 · 632 阅读 · 0 评论 -
优先队列与堆排序(二)
堆排序原创 2018-06-12 20:29:29 · 148 阅读 · 0 评论 -
链表
当需要顺序访问集合中每个数据项时,可以将数据项组织为链表,其每个数据项中都包含我们所需要的到达下一个数据项的信息。链表比数组的优势在于,它可以提供高效的重排数据项的能力,其代价是不能快速访问表中任意数据项。定义:链表是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点都包含指向下一个节点的链接。对于链表的末尾节点:1.将其置为不指向任何节点的空链接。2.使其指向一个不包含元素节点的 哑...原创 2018-05-31 20:43:42 · 165 阅读 · 0 评论 -
散列
1.散列搜索算法由两部分组成:1.计算一个散列函数:将搜索关键字转换为表中地址。2.冲突解决:处理多个关键字对应同一个地址的情况。2.散列缺点:1.运行时间依赖于关键字长度,对于长关键字不利。2.对于选择和排序操作,散列不能带来高效。散列一般应用于有大量搜索、插入、删除的操作中。3.散列函数:散列函数将关键字的值转化为表中的地址。一个好的散列函数应该考虑关键字的全部位。理想的通用散列函数使得表中两...原创 2018-05-29 20:11:15 · 722 阅读 · 0 评论 -
递归与树(一)
递归递归算法就是通过解决同一问题的一个或多个更小的实例来最终解决一个大问题的算法。递归函数就是能调用自身的函数。递归算法是递归定义的函数。递归的深度就是计算过程中嵌套函数调用的最大程度。递归函数满足下面两个基本属性:1.必须明确的解决归纳基础。2.每一次递归调用,必须包括更小的参数值。递归举例:链表求逆void traverseR(link h,void(*visit)(link)){ ...原创 2018-06-05 20:12:28 · 563 阅读 · 0 评论 -
排序算法--归并排序
归并:将两个排好序的文件组合成一个更大的有序文件。选择和归并互补,选择将一个文件分解成两个独立的文件,而归并将两个独立的文件合并成一个文件。 归并排序的优点:就是无论什么样的输入,它对N个元素文件的排序所需时间与NlogN成正比。并可以顺序的访问数据。 其缺点:就是所需的空间与N成正比。 自顶向下归并排序:是将一个大的任务分成几个可以独立解决的部分,将...原创 2018-04-20 20:16:55 · 174 阅读 · 0 评论 -
排序算法--选择排序
选择排序选出数组中最小的元素,交换放入数组第一的位置;选出数组中次小的元素,交换放入数组中第二的位置,直到整个数组有序。通过不断选出剩余元素中的最小元素实现。注:N个元素,只需要N-1趟交换操作(最后一个元素被自动归入正确的位置)#include <stdio.h>void swap(int *a,int *b){ if((a == NULL) || (b == NULL)...原创 2018-04-13 20:06:32 · 188 阅读 · 0 评论 -
排序算法--快速排序
快速排序是一种分治排序算法,将数组分为两个部分,然后分别对两个部分进行排序。划分过程是不稳定的,因为每个元素都有可能在交换时被移到大量与它相等的元素(未经检测)后面。划分过程如下:选择一个a[r]作为划分元素,这个元素在划分后将在最终的位置上。然后从数组的左端进行扫描,直到找到一个大于划分元素的元素。同时从数组的右端开始扫描,直到找到一个小于划分元素的元素。使扫描停止的这两个元素,显然在最终的划分...原创 2018-04-19 16:59:36 · 243 阅读 · 0 评论 -
排序算法--希尔排序
void Shellsort( ElementType A[ ], int N ){ int i, j, Increment; ElementType Tmp; for( Increment = N / 2; Increment > 0; Increment /= 2 )/*希尔排序的步长选择从n/2开始,每次再减半,直到最后为1*/ for( i = Increment; i...原创 2018-04-18 20:31:40 · 162 阅读 · 0 评论 -
排序算法--插入排序
void insert(int a[],int n){ int p,i,temp; if(a == NULL) return; for(p=1;p<n;p++) { temp = a[p]; for(i=p;i>0 && a[i-1] > temp;i--) a[i]=a[i-1]; a[i]=temp; } return;...原创 2018-04-16 20:07:44 · 181 阅读 · 0 评论 -
递归与树(二)
函数:typedef struct node *link;struct node{ Item item; link l; link r;} 定义:任意两个节点只有一条唯一的路径。 如果在几对节点中不止一条的路径,或者在几对节点中没有路径,则为图。 二叉数性质: 根节点在第0层。 一棵有N个内部节点的二叉树有N+1个外...原创 2018-06-07 20:26:50 · 215 阅读 · 0 评论