算法学习
文章平均质量分 76
技术人生LJF
空杯心态
展开
-
二叉查找树
#include //二叉查找树//结合了链表插入的灵活性和有序数组查找的高效性,适用于经常插入\查找//的场合使用.//其中二叉查找树的特性为每个节点最多有两个子节点,其中左子节点小于当//前节点,右子节点大于当前节点// 6// / \// 3 8// / \ / \//原创 2015-08-08 09:33:41 · 410 阅读 · 0 评论 -
堆排序
#include "util.h"//堆排序////二叉堆的特性就是每个节点的数值都比子节点的数据大,所以二叉堆最顶端的数值是最大的//这里采用数组来存储二叉堆,为了方便计算父节点与叶子节点的索引,数据索引0没有使用,数//组有效索引从1开始, 给定任意节点索引X,该节点的父节点索引为X/2,该节点的左叶子节点索//引为 X*2, 右叶子节点索引为X*2+1////原创 2015-08-02 15:44:29 · 455 阅读 · 0 评论 -
插入排序
#include "util.h"//插入排序://第一轮比较第2个数与第1个数之间大小并进行排序//第二轮比较第3个数与第2个数的大小,如果小于则交换,交换后再使用第2个数与第1个数比较//第三轮比较第4个数与第3个数的大小,如果小于则交换,交换后再使用第3个数与第2个数比较,注意//当前排序算法在外循环不断递增时,前面的数据已经是有序的了,所以如果内循环比较过程中,出现//后面的原创 2015-08-02 08:53:53 · 341 阅读 · 0 评论 -
无序链表的顺序查找
#include #include //无序链表的顺序查找//1 使用链表数据结构将字典对进行存储//2 KEY值不能重复//3 新插入数据时,如果出现KEY值重复,则当前字典中该KEY键的值替换// 为最新插入的值//4 对应的KEY键在字典中没有找到时,返回查找值为-1typedef struct _NODE{ int key; int val;原创 2015-08-04 07:52:58 · 795 阅读 · 0 评论 -
基于有序数组的二分查找
#define MAX_COUNT 100//基于有序数组的二分查找int keys[MAX_COUNT] = {0};int values[MAX_COUNT] = {0};int count = 0;int isEmpty(){ return count == 0;}//根据给定的关键字,在字典中查找是否有匹配项,并返回匹配的项的//数组索引,如果没有找到匹配原创 2015-08-05 07:12:41 · 475 阅读 · 0 评论 -
深度优先搜索
1、graph.h#ifndef _GRAPH_H_H#define _GRAPH_H_H#define ENABLE_GRAPH_TEST 0#define CHECK_NULL_AND_RET(x) { if((x) == NULL) return -1; }typedef struct _ADJ_ENTRY{ int adjoinP原创 2015-08-15 19:33:31 · 474 阅读 · 0 评论 -
广度优先搜索
1、queue.h#ifndef _QUEUE_H_#define _QUEUE_H_#define ENABLE_QUEUE_TEST 0typedef struct{ int *data; int head; int tail; int count; int size;} QUEUE;int queueCreate(QUEUE* p原创 2015-08-16 16:23:16 · 438 阅读 · 0 评论 -
Dijkstra最短路径算法(针对加权有向图)
indexMinPQ.h#ifndef _INDEX_MIN_PQ_H_#define _INDEX_MIN_PQ_H_#define INDEX_MIN_PQ_TEST 0typedef struct{ int index; double cmpNum;} INDEX_MIN_PQ_DATA;typedef struct{ int原创 2015-09-02 14:00:00 · 5289 阅读 · 0 评论 -
键索引计数法
#include #include #include //键索引计数法#define KEY_BASE 5typedef struct{ char *pString; //条目字符串内容 int key; //条目的归类键值,比如张三属于1类等} S_ELEMENT;//键索引计数法关键流程//1、频率统计//2、将频率转换为索引//3原创 2015-09-13 18:20:25 · 1207 阅读 · 0 评论 -
高位优先的字符串排序
#include #include #include //MSD(Most Significant Digit First) 高位优先的字符串排序//该算法基于键索引计数法的思想,进行了扩展,使得该算法可以//处理不等长的字符串排序,其中涉及两个关键点。//1、采用分治法,从高位向低位的方向,依次选取关键字做为排序// 的键字进行排序,每一轮排序后,将字符串组进行拆分,对拆原创 2015-09-16 07:45:43 · 2328 阅读 · 0 评论 -
自底向上归并排序
#include "util.h"/*自底向上归并排序:首先将大问题拆成小问题,第一轮左半部及右半部的每组数据都为1,进行归并排序第二轮左半部及右半部每组数据个数都为2,进行归并排序第三轮左半部及右半部每组数据个数都为4,进行归并排序依此类推......1 xx|xx|xx|xx|xx|xx|xx|xx|2 xxxx|xxxx|xxxx|xxxx|3 xxxxxxxx|xxxx原创 2015-08-02 09:05:16 · 2822 阅读 · 3 评论 -
自顶向下归并排序
#include "stdio.h"#include "stdlib.h"#include "util.h"//自顶向下归并排序//采用分治思想,将整个数据分成最小部分,使用原地归并先将最小部分归并//,之后再一点点进行扩大数据,最终将整个数据归并完成.void sort(int iArray[], int lo, int hi){ int mid = lo + (hi -原创 2015-08-02 09:01:55 · 565 阅读 · 0 评论 -
希尔排序
#include "util.h"//希尔排序:void sort(int iArray[], int size){ int i = 0; int j = 0; int h = 1; //希尔排序在插入排序算法的基础上,增加了一层外循环,则这层循环 //的次数取绝于当前需要排序数据的多少,这里采用了近似3的倍数为步 //长,直到h的值大于数原创 2015-08-02 08:54:55 · 408 阅读 · 0 评论 -
红黑二叉查找树
#include //红黑二叉查找树//红黑二叉查找树是一种平衡二叉树,是基于2-3查找树的基础上演变的//这里不对2-3查找树的算法进行描述,感兴趣的朋友可以自行了解一下//2-3查找树的实现原理.////在2-3查找树算法中,难点就是3-Node类型(含有2个key,3个子节点的节点类型)//的节点数据结构处理,那么在红黑二叉查找树中这种3-Node类型节点演变为如//下表原创 2015-08-09 19:18:40 · 1397 阅读 · 0 评论 -
基于线性探测法的散列表
#include //基于线性探测法的散列表//使用线性探测解决键冲突问题,核心思想就是利用数组空位,当使用//哈希函数计算出数组索引后,开始检测该索引位置是否已经被使用,如//果已经使用,则索引向后递增(如果超出数组索引,则需要进行回绕到//数组起始索引),直到找到空位为止,或者数组空间已全部被使用,无//法再扩冲,由于这里利用的是数组空间,所以通常情况下,需要该数组//支持动原创 2015-08-13 07:04:32 · 2438 阅读 · 0 评论 -
基于拉链法的散列表
#include //基于拉链法的散列表//散列表通常一个难点就是出现键冲突后,如果进行冲突解决,//基于拉链法的散列表给每个键分配一个链表,当出现键冲突时,//将冲突键的条目项都挂接到一个链表下,从而解决了键冲突问题。#define MAX_HASH_ARRAY 50typedef struct _HASH_NODE{ int key原创 2015-08-13 07:03:19 · 3465 阅读 · 0 评论 -
原地归并排序
#include "stdio.h"#include "stdlib.h"#include "util.h"//原地归并排序://原地归并排序是将两组有序的数据合入一组,这里使用1个数组来存储两种有序数据.//该算法先将所有元素复制到一个临时数组aux中,之后进行归并处理,//归并处理分为4种情况//1 如果右半部已经没有数据,则将剩余的左半部全部追加到结果中//2 如果左半部已原创 2015-08-02 09:01:26 · 522 阅读 · 0 评论 -
三向切分快速排序
#include "util.h"//三向切分快速排序//核心思想就是将待排序的数据分为三部分,左边都小于比较值,右边都//大于比较值,中间的数和比较值相等.//三向切分快速排序的特性就是遇到和比较值相同时,不进行数据交换,//这样对于有大量重复数据的排序时,三向切分快速排序算法就会优于//普通快速排序算法,但由于它整体判断代码比普通快速排序多一点,所//以对于常见的大量非重复数据原创 2015-08-02 09:10:32 · 3048 阅读 · 0 评论 -
快速排序
#include "util.h"//快速排序//核心思想就是先选择一个比较值,然后从数据左侧开始前查找,找出一个比该值大的值,记下当前索引为i//之后从右侧开始向后查找,找出一个比该值小的值,记下当前索引为j,之后交换这两个索引的值,使得左侧//数据都小于该比较值,右侧数据都大于该比较值,当前向查找与后向查找的索引相遇时,或者前向查找已经//到了最右端,或者后向查找已经到了最左端,则原创 2015-08-02 09:09:05 · 419 阅读 · 0 评论 -
prim最小生成树算法
edge.h#ifndef _EDGE_H_#define _EDGE_H_typedef struct{ int v; //顶点之一 int w; //另一个顶点 double weight; //边的权重} EDGE;void edgeInit(EDGE* pEdge, int v, in原创 2015-08-29 10:12:32 · 620 阅读 · 0 评论 -
基于深度优先算法的有向图环路检测
1、digraph.h #ifndef _DIGRAPH_H_H#define _DIGRAPH_H_H#define ENABLE_DIGRAPH_TEST 0#define CHECK_NULL_AND_RET(x) { if((x) == NULL) return -1; }typedef struct _ADJ_ENTRY{ int原创 2015-08-19 08:00:44 · 3982 阅读 · 0 评论 -
选择排序
#include "util.h"//选择排序://第一轮找出最小的数值放在iArray[0]//第二轮找出次最小数值放在数组iArray[1]//依次类推void sort(int iArray[], int aSize){ int i, j; for ( i = 0; i < aSize; i++ ) { int min = i;原创 2015-08-02 08:49:30 · 426 阅读 · 0 评论 -
三向字符串快速排序
#include #include #include //三向字符串快速排序//基于快速排序的思想,依据键值进行比较,划分为小于当前//键值、等于当前键值、大于当前键值的3个子组,之后采用递//归方法分别对3个子组再次进行排序。由于等于当前键值的子//组所有键都已经相同,所以无需再比较当前键值,而选取下//一列索引字符做为键值。////如下示例所示,最初仅有一个排序组,有6原创 2015-09-20 22:23:47 · 1770 阅读 · 0 评论