自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

C语言、数据结构、算法

Talk is cheap,show me the code!(xueda120(at)gmail.com)

  • 博客(158)
  • 收藏
  • 关注

C语言退出多层嵌套循环技巧

由于break语句只能影响它的最内层循环,要想立即从深层嵌套循环中退出,有哪些方法呢?1、使用goto语句:while(condition1) { while(condition2) { while(condition3) { if(some disaster) goto quit; ...

2014-04-24 11:33:44 3515

C语言实现泛型编程

泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。在C语言中,可以通过一些手段实现这样的泛型编程。这里介绍一种方法——通过无类型指针void*看下面的一个实现交换两个元素内容的函数swap,以整型int为例:void swap(int* i1,int* i2){ int temp; temp = *...

2014-04-24 11:21:08 514

C语言函数指针的用法

函数指针是一种在C、C++、D语言、其他类 C 语言和Fortran 2003中的指针。函数指针可以像一般函数一样,用于调用函数、传递参数。在如 C 这样的语言中,通过提供一个简单的选取、执行函数的方法,函数指针可以简化代码。函数指针只能指向具有特定特征的函数。因而所有被同一指针运用的函数必须具有相同的参数和返回类型。下面的代码说明了一种初始化函数指针的方法:int f(in...

2014-04-24 11:06:42 224

遍历二叉树的递归与非递归算法

利用递归实现二叉树的先序,中序,后序遍历操作/* 先序、中序、后序递归遍历二叉树算法 */void PreOrder(BiTree T) //先序遍历{ if(T != NULL) { visit(T); //访问根节点 PreOrder(T -> lchild)...

2013-12-20 11:00:41 153

原创 堆排序

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆节点的访问通常堆是通过一维数组来实现的。在起始数组为 0 的情形中:父节点i的左子节点在位置 (2*i+1);父节点i的右子节点在位置 (2*i+2);子节点i的父节点在位置 floor((i-1...

2013-12-12 10:56:35 99

原创 希尔排序

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位算法实现原始的算法实现在最坏的情况下需要进行O(n2)的比较和交换。V. Pratt的...

2013-12-12 10:12:09 228

原创 插值查找算法

#include<stdio.h>#include<string.h>#include<math.h>#include<ctype.h>#include<stdbool.h>int Insert_search(int *a, int key, int n){ int pos, low, high...

2013-12-11 22:31:42 217

原创 斐波那契查找算法

斐波那契查找的核心是:  1)当key=a[mid]时,查找成功;  2)当key<a[mid]时,新的查找范围是第low个到第mid-1个,此时范围个数为F[k-1] - 1个,即数组左边的长度,所以要在[low, F[k - 1] - 1]范围内查找;  3)当key>a[mid]时,新的查找范围是第mid+1个到第high个,此时范围个数为F[k-2] - 1个,即数组右边的长...

2013-12-11 20:55:13 233

原创 折半查找算法

在计算机科学中,折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。 复杂度分析 时间复杂度...

2013-12-11 20:52:55 304

原创 直接插入排序

直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。设数组为a[0…n-1]。1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=12. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。3. i++并重复第二步直到i==n-...

2013-12-11 01:05:42 94

原创 Gnome排序

Gnome排序(地精排序),起初由Hamid Sarbazi-Azad 于2000年提出,并被称为stupid排序,后来被Dick Grune描述并命名为“地精排序”,作为一个排序算法,和插入排序类似,除了移动一个元素到最终的位置,是通过交换一系列的元素实现,就像冒泡排序一样。概念上十分简单,不需要嵌套循环。时间复杂度为O,但是如果初始数列基本有序,时间复杂度将降为O(n)。实际上Gnome算...

2013-12-11 01:03:59 118

原创 选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到...

2013-12-10 15:08:08 97

原创 Bogo排序

在计算机科学中,Bogo排序(bogo-sort)是个既不实用又原始的排序算法,其原理等同将一堆卡片抛起,落在桌上后检查卡片是否已整齐排列好,若非就再抛一次。其名字源自Quantum bogodynamics,又称bozo sort、blort sort或猴子排序.#include<stdio.h> #include<string.h> #inclu...

2013-12-10 15:05:46 265

原创 Stooge 排序

Stooge排序是一种低效的递归排序算法,甚至慢于冒泡排序。在《算法导论》第二版第7章(快速排序)的思考题中被提到,是由Howard、Fine等教授提出的所谓“漂亮的”排序算法。实现如果最后一个值小于第一个值,则交换它们如果当前子集元素数量大于等于3:使用Stooge排序前2/3的元素使用Stooge排序后2/3的元素再次使用Stooge排序前2/3的元素...

2013-12-10 14:46:02 104

原创 快排序

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。算法快速排序采用一种“分而治之、各个击破”的观念。快速...

2013-12-10 14:42:19 73

原创 梳排序

梳排序(Comb sort)是一种由Wlodzimierz Dobosiewicz于1980年所发明的不稳定排序算法,并由Stephen Lacey和Richard Box于1991年四月号的Byte杂志中推广。梳排序是改良自泡沫排序和快速排序,其要旨在于消除乌龟,亦即在阵列尾部的小数值,这些数值是造成泡沫排序缓慢的主因。相对地,兔子,亦即在阵列前端的大数值,不影响泡沫排序的效能。在泡沫排序...

2013-12-10 10:32:19 158

原创 无向图的邻接多重表存储

/* c7-4.h 无向图的邻接多重表存储表示 */ #define MAX_VERTEX_NUM 20 typedef enum{unvisited,visited}VisitIf; typedef struct EBox { VisitIf mark; /* 访问标记 */ int ivex,jvex; /* 该边依附的两个顶点的位置 */ str...

2013-12-07 23:00:22 601 2

原创 有向图的十字链表存储

/* c7-3.h 有向图的十字链表存储表示 */ #define MAX_VERTEX_NUM 20 typedef struct ArcBox { int tailvex,headvex; /* 该弧的尾和头顶点的位置 */ struct ArcBox *hlink,*tlink; /* 分别为弧头相同和弧尾相同的弧的链域 */ InfoType *i...

2013-12-07 22:56:18 357

原创 图的邻接表存储

/* c7-2.h 图的邻接表存储表示 */ #define MAX_VERTEX_NUM 20 typedef enum{DG,DN,AG,AN}GraphKind; /* {有向图,有向网,无向图,无向网} */ typedef struct ArcNode { int adjvex; /* 该弧所指向的顶点的位置 */ struct ArcNode *n...

2013-12-07 22:53:26 192

原创 图的邻接矩阵存储

/* algo7-1.c 调用算法7.7、7.8 */ #include"c1.h" #define MAX_NAME 2 /* 顶点字符串的最大长度+1 */ typedef char ElemType[MAX_NAME]; typedef ElemType TElemType; #include"c6-5.h" typedef int InfoType; ty...

2013-12-07 22:46:07 220

原创 树的二叉链表(孩子-兄弟)存储

/* c6-5.h 树的二叉链表(孩子-兄弟)存储表示 */ typedef struct CSNode { TElemType data; struct CSNode *firstchild,*nextsibling; }CSNode,*CSTree;  /* bo6-5.c 树的二叉链表(孩子-兄弟)存储(存储结构由c6-5.h定义)的基本操作(1...

2013-12-06 23:46:49 816

原创 树的双亲表存储

/* c6-4.h 树的双亲表存储表示 */ #define MAX_TREE_SIZE 100 typedef struct { TElemType data; int parent; /* 双亲位置域 */ } PTNode; typedef struct { PTNode nodes[MAX_TREE_SIZE]; int n; ...

2013-12-06 23:44:49 165

原创 二叉树的二叉线索存储

/* c6-3.h 二叉树的二叉线索存储表示 */ typedef enum{Link,Thread}PointerTag; /* Link(0):指针,Thread(1):线索 */ typedef struct BiThrNode { TElemType data; struct BiThrNode *lchild,*rchild; /* 左右孩子指针 */...

2013-12-06 21:31:51 118

原创 二叉树的二叉链表存储

/* c6-2.h 二叉树的二叉链表存储表示 */ typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; /* 左右孩子指针 */ }BiTNode,*BiTree;  /* bo6-2.c 二叉树的二叉链表存储(存储结构由c6-2.h定义)的基本操作(22个) ...

2013-12-06 18:03:04 758

原创 二叉树的顺序存储

/* c6-1.h 二叉树的顺序存储表示 */ #define MAX_TREE_SIZE 100 /* 二叉树的最大结点数 */ typedef TElemType SqBiTree[MAX_TREE_SIZE]; /* 0号单元存储根结点 */ typedef struct { int level,order; /* 结点的层,本层序号(按满二叉树计算) */...

2013-12-06 18:00:46 574

原创 串的块链存储表示

/* c4-3.h 串的块链存储表示 */ #define CHUNKSIZE 4 /* 可由用户定义的块大小 */ typedef struct Chunk { char ch[CHUNKSIZE]; struct Chunk *next; }Chunk; typedef struct { Chunk *head,*tail; /* 串的头和...

2013-11-29 15:31:17 420

原创 串的堆分配存储

/* c4-2.h 串的堆分配存储 */ typedef struct { char *ch; /* 若是非空串,则按串长分配存储区,否则ch为NULL */ int length; /* 串长度 */ }HString;  /* bo4-2.c 串采用堆分配存储结构(由c4-2.h定义)的基本操作(15个) */ /* 包括算法4.1、4.4 *...

2013-11-29 15:31:01 336

原创 串的定长顺序存储表示

/* c4-1.h 串的定长顺序存储表示 */ #define MAXSTRLEN 40 /* 用户可在255以内定义最大串长(1个字节) */ typedef char SString[MAXSTRLEN+1]; /* 0号单元存放串的长度 */  /* bo4-1.c 串采用定长顺序存储结构(由c4-1.h定义)的基本操作(14个) */ /* SString是数...

2013-11-29 15:30:46 268 1

原创 顺序队列

/* c3-3.h 队列的顺序存储结构(可用于循环队列和非循环队列) */ #define MAXQSIZE 5 /* 最大队列长度(对于循环队列,最大队列长度要减1) */ typedef struct { QElemType *base; /* 初始化的动态分配存储空间 */ int front; /* 头指针,若队列不空,指向队列头元素 */ int...

2013-11-28 00:24:03 86

原创 单链队列

/* c3-2.h 单链队列--队列的链式存储结构 */ typedef struct QNode { QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front,rear; /* 队头、队尾指针 */ }LinkQueue;...

2013-11-28 00:23:37 211

原创 栈的顺序存储表示

/* c3-1.h 栈的顺序存储表示 */ #define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */ #define STACKINCREMENT 2 /* 存储空间分配增量 */ typedef struct SqStack { SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */ SEle...

2013-11-28 00:23:17 260

原创 双向循环链表

/* c2-4.h 线性表的双向链表存储结构 */ typedef struct DuLNode { ElemType data; struct DuLNode *prior,*next; }DuLNode,*DuLinkList;  /* bo2-5.c 双链循环线性表(存储结构由c2-4.h定义)的基本操作(14个) */ Status Ini...

2013-11-28 00:23:08 102

原创 单循环链表的表示和实现

/* bo2-4.c 设立尾指针的单循环链表(存储结构由c2-2.h定义)的12个基本操作 */ Status InitList_CL(LinkList *L) { /* 操作结果:构造一个空的线性表L */ *L=(LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */ if(!*L) /* 存储分配...

2013-11-28 00:22:39 109

原创 线性表的单链表表示和实现

/* c2-2.h 线性表的单链表存储结构 */ struct LNode { ElemType data; struct LNode *next; }; typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */  /* bo2-2.c 单链表线性表(存储结构由c2-2.h定义)的基本操作(12个) ...

2013-11-27 19:19:15 195

原创 鸡尾酒排序算法

鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形。此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。#include<stdio.h> #include<string.h> #include<math.h> ...

2013-11-27 18:06:24 300

原创 奇偶排序算法

奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算。这是与冒泡排序特点类似的一种比较排序。该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换。下一步重复该操作,但针对所有的(偶-奇)位置数字对。如此交替进行下去。处理器数组的排序在并行计算排序中,每个处理器对应处理一个值,并仅有与左右邻居的本...

2013-11-27 17:57:53 562

原创 冒泡排序算法

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序对个项目需要O()的比较次数,且可以原地排序。尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数...

2013-11-27 17:47:42 80

原创 计算机排序算法

在计算机科学与数学中,一个排序算法(Sorting algorithm)是一种能将一串数据依照特定排序方式的一种算法。最常用到的排序方式是数值顺序以及字典顺序。有效的排序算法在一些算法(例如搜索算法与合并算法)中是重要的,如此这些算法才能得到正确解答。排序算法也用在处理文字数据以及产生人类可读的输出结果。基本上,排序算法的输出必须遵守下列两个原则:输出结果为递增串行(递增是针对所需的排序...

2013-11-27 17:44:14 108

原创 (Problem 37)Truncatable primes

The number 3797 has an interesting property. Being prime itself, it is possible to continuously remove digits from left to right, and remain prime at each stage: 3797, 797, 97, and 7. Similarly we c...

2013-11-26 22:30:09 97

原创 (Problem 92)Square digit chains

A number chain is created by continuously adding the square of the digits in a number to form a new number until it has been seen before.For example,44  32  13  10  1  185  89  145  42  20  4  1...

2013-11-24 18:30:07 135

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除