![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
懒人李冰
音视频编解码
展开
-
算法学习之查找算法:动态查找表(1)二叉排序树
引言: 动态查找表的特点是在表结构原创 2014-09-25 14:26:15 · 3076 阅读 · 0 评论 -
队列——链表实现
引言: 队列与栈的区别是队列是先进先出的数据结构。为了使得出入队列容易,可以引入队列头指针和队列尾指针。分析描述: 队列的结点结构。typedef int QElemType;typedef struct QNode{ QElemType data; struct QNode *next;}QNode, *QueuePtr;原创 2014-07-09 13:38:52 · 1855 阅读 · 0 评论 -
队列——数组实现
引言: 队列的实现除了链表外,也可用数组实现。分析描述: 队列的结构:typedef int ElementType;typedef struct QueueRecord{ int Capacity; int Front; int Rear; int Size; ElementType *Array;}QueueRecor原创 2014-07-10 18:26:50 · 1332 阅读 · 0 评论 -
【剑指offer】二进制中1的个数
题目描述: 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。分析描述: 1、对一个整数的二进制形式,要想知道其中1的个数,首先想到的应该就是遍历整个二进制数,用到的方法当然就是移动了(包含左移或右移)。例如,用1来跟给定的整数做与运算。如果结果为1原创 2014-07-09 21:09:00 · 872 阅读 · 0 评论 -
【剑指offer】旋转数组的最小数字
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。分析描述: 求一个数组中的最小值,最简单的办法就是逐个比较数组中各个元素的值,遍历完整个数组,即可得数组中最小元素。但原创 2014-07-09 17:04:08 · 1031 阅读 · 0 评论 -
【剑指offer】打印1到最大的n位数
题目描述: 输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。分析描述: 首先想到的是先计算出最大的n位数是多少,然后用一个循环从1开始打印直到最大的n位数。void Print1ToMaxOfNDigits_1(int n){ if(n <= 0) return;原创 2014-07-10 10:21:20 · 1364 阅读 · 0 评论 -
【剑指offer】数值的整数次方
题目描述: 实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。分析描述: 对于实现一个函数,首先要做的就是全面考虑它的参数的全部可能。对于此题中的数值函数,应该考虑的参数有整数、0、负数、浮点型、整型、是不是大数问题等。原创 2014-07-10 07:22:35 · 1210 阅读 · 0 评论 -
双向链表
引言: 单链表存在一个问题,当我们想要访问某个结点的前一个结点时,要从头结点开始访问。显然这样的操作是令人烦躁的。为此,双向链表出现,它比单链表多出了一个指针域,指向前一个结点。这样,对于双向链表,就可以方便的从后向前遍历链表了。但多出的问题是对于插入和删除结点的开销要增加一倍。分析描述: 双向链表存储结构图为:,用结构体表示如下:原创 2014-07-08 22:39:54 · 1035 阅读 · 0 评论 -
栈——数组实现
引言: 使用链表实现栈存在“对malloc和free的调用开销昂贵”的缺点,特别是与指针操作的例程相比尤其如此。利用数组实现栈可以避免了指针。但它的缺点是可能存在空间的浪费。分析描述: 数组栈的结点元素。#ifndef ERROR#define ERROR (0)#endif#ifndef OK#define OK (!原创 2014-07-09 10:24:51 · 1214 阅读 · 0 评论 -
最大公约数问题
引言:最大公约数就是给出两个数,找出它们的最大公约数。该问题算法实现技巧性比较强,面试中常出现,现在分析之。问题描述:给出两个正整数A、B,求出这两个正整数的最大公约数。算法一:更相减损术更相减损术又称“等值算法”,由我国古代《九章算术》中提出。描述如下:“以少减多,更相减损,求其等也,以等数约之,等数约之,即除也,其所以相减者皆等数之重叠,故以等数约之。”就是原创 2014-07-06 11:32:58 · 1207 阅读 · 0 评论 -
单链表
引言: 数据结构中,很重要的一个结构就是链表。链表虽然简单,但却能很好的考查程序员的基本功,因此在很多面试、笔试中会直接或间接的考查它。下面就对链表进行系统的复习。分析描述: 下面就对链表的构建、删除、插入、查找、求长等操作进行系统描述。并给出程序代码。其中结点的定义如下:typedef int ElementType;typede原创 2014-07-08 19:49:28 · 1145 阅读 · 0 评论 -
最大子序列和问题
最大连续子序列问题可以很好的让我们了解算法对于程序设计的重要性,因此会在诸多面试笔试题目中考到,现在对它进行一个总结。问题描述:求数组中最大连续子序列和。例如给定数组A={4,-3, 5,-2,-1, 2, 6,-2},则最大子序列和为11,即11=4+(-3)+5+(-2)+(-1)+2+6。解法1——时间复杂度O(N^3)首先能想到的算法就是将所有的连续子序列和求原创 2014-07-06 08:41:40 · 1189 阅读 · 0 评论 -
【剑指offer】斐波那契数列
题目1描述: 写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下:f(n) = 0 (n = 0); f(n) = 1 (n = 1); f(n) = f(n-1)+f(n-2) (n > 1);分析描述: 在大多数的C语言教科书中,一般会用递归求斐波那契数列。代码如下:long long Fibonacci(原创 2014-07-09 20:01:37 · 942 阅读 · 0 评论 -
二叉查找树
引言: 使二叉树成为二叉查找树的性质是:对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。二叉查找树声明struct TreeNode;typedef struct TreeNode *Position;typedef struct TreeNode *SearchTree;struct T原创 2014-07-12 10:56:37 · 1033 阅读 · 0 评论 -
算法学习之查找算法:静态查找表(2)有序表查找
如果静态查找表是一个有序表,则可以使用折半查找。 折半查找的过程是:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者查找区间的大小小于零时(表明查找不成功)为止。 关键字key与原创 2014-09-24 20:57:55 · 2128 阅读 · 0 评论 -
算法学习之排序算法:归并排序
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。无论是顺序存储还是链表存储结构,都可在O(m+n)的时间量级上实现。 归并排序又是一类不同的排序方法。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个为2或1的有序子序列;再两两归并,....... ,如此重复,直至得到一个长度为n的有序序列为止。初始关原创 2014-09-13 09:12:37 · 1416 阅读 · 1 评论 -
算法学习之排序算法:选择排序
选择排序:每一趟在n-i+1(i=1,2,...,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。一、简单选择排序 一趟选择排序操作: 通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1 对L[1...n]中记录进行简单选择排序的算法为:令i从1至原创 2014-09-12 07:17:35 · 1484 阅读 · 2 评论 -
算法学习之排序算法:快速排序
快速排序:快速排序是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。一趟快速排序的具体做法:1、附设两个指针low和high,它们的初值分别为low和high,设枢轴记录的关键字为pivotkey。2、首先从high所指位置起向前搜索找到第一原创 2014-09-11 09:15:20 · 1621 阅读 · 0 评论 -
算法学习之查找算法:静态查找表(1)顺序表查找
引言: 查找表一般原创 2014-09-22 06:44:17 · 4115 阅读 · 1 评论 -
算法学习之排序算法:堆排序
要了解堆排序,首先要了解堆的概念,因为本文主要研究堆排序的算法,此处对数据结构堆只是给出概念:n个元素的序列{k1,k2,...kn},当且仅当满足如下关系时,称之为堆。k[i] (或k[i] >= k[2i]且k[i] >= k[2i+1])比如:序列96、83、27、38、11、09(或12、36、24、85、47、30、53、91)都是堆。 如果将堆对应的一维数原创 2014-09-20 08:16:02 · 1772 阅读 · 1 评论 -
算法学习之排序算法:冒泡排序
冒泡排序:不同于插入排序,冒泡排序主要通过“交换”来完成。基本思想:1、将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(Record[1].key > Record[2].key),则将两个记录 交换之,然后比较第二个记录和第三个记录的关键字。2、依次类推,直至第n-1个记录和第n个记录的关键字被安置到最后一个记录的位置上。完成第一趟冒泡排序。结果使原创 2014-09-07 07:25:07 · 1647 阅读 · 0 评论 -
算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)
引言: 插入排序作为最简单易于理解的排序算法,基本实现比较简单。本文详细介绍直接插入排序,并给出实现,简单的介绍折半插入排序,并给出2-路插入排序和表插入排序两种插入排序,但并未给出具体实现。一、直接插入排序 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。原创 2014-09-07 06:03:45 · 2153 阅读 · 0 评论 -
算法学习之排序算法:希尔排序
希尔排序又称“缩小增量排序”,它的基本思想是:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对记录进行一次直接插入排序。 希尔排序的一个特点是:子序列的构成不是简单地“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。这就使得希尔排序中关键字较小的记录不是一步一步地往前挪动,而是一次按照“增量”的大小跳跃式地往前移,从而使原创 2014-09-06 23:50:10 · 1825 阅读 · 0 评论 -
七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。因此排序掌握各种排序算法非常重要。对下面介绍的各个排序,我们假定所有排序的关键字都是整数、对传入函数的参数默认是已经检查好了的。只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨。基础知识:原创 2014-07-16 08:01:40 · 10098 阅读 · 10 评论 -
栈——链表实现
引言: 栈是先进后出的数据结构类型。在许多应用中也会经常用到,比如迷宫的求解时会用到栈结构。掌握栈的基本操作对于解决问题,有很大的帮助,尤其是编程中经常用到的递归的思想,就是栈的一个例子。分析描述: 栈的实现有两种方法,一种是用链表来完成。这种方法比较简单,我们先掌握这种方法。另一种是用顺序表(即数组)来实现栈。下一节原创 2014-07-09 09:31:45 · 1006 阅读 · 0 评论 -
二分查找
引言:二分查找是学习数据结构时,接触比较早的一个算法,面试题中也经常考察到。现在对它进行总结。问题描述:给定一个整数X和整数A0、A1、A2……A(n-1),后者已经预先排序并在内存中,求使得Ai=X的下标i,如果X不在数据中,则返回i=-1。示例,X = 3,X = 6; A[] = {1,3,5,9}。分析如下:充分利用数组A是一个有序数组的特性,验证X是否原创 2014-07-06 10:30:01 · 1038 阅读 · 0 评论 -
我的算法学习之路
关于严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的。这篇文章讲了什么?我这些年学习数据结构和算法的总结。一些不错的算法书籍和教程。算法的重要性。初学第一次接触数据结构是在大二下学期的数据结构课程。然而这门课程并转载 2014-07-04 07:48:07 · 775 阅读 · 0 评论 -
串的堆分配存储表示的C语言实现
串的堆表示以及实现原创 2014-04-25 20:09:04 · 1512 阅读 · 0 评论 -
线性链表(单链表)
单链表的部分实现原创 2014-04-21 15:39:10 · 899 阅读 · 0 评论 -
串的定长顺序存储C语言实现
串(字符串)是由0个或多个字符组成的有限序列。0个字符时称为空串原创 2014-04-23 22:44:55 · 1901 阅读 · 0 评论 -
链队列的C语言实现
下面的代码实现了除销毁队列以外的所有队列操作:原创 2014-04-23 08:44:23 · 942 阅读 · 1 评论 -
顺序栈的C语言实现
代码实现如下:原创 2014-04-22 21:44:16 · 728 阅读 · 0 评论 -
行编辑程序C语言实现
例:当用户发现刚刚键入的yige原创 2014-04-22 13:59:58 · 2483 阅读 · 0 评论 -
双向链表的C语言实现
双向链表:结点中有两个指针域,分别指向其前驱元素原创 2014-04-21 22:21:02 · 764 阅读 · 0 评论 -
C语言实现数值转换(十进制转八进制)
原理:N = (N div d) * d + N mod d;原创 2014-04-22 11:20:40 · 5940 阅读 · 0 评论 -
将两个有序链表并为一个有序链表
如何将两个youxiu原创 2014-04-21 19:30:06 · 1029 阅读 · 0 评论 -
二叉树的C语言实现
二叉树的C语言实现原创 2014-05-06 20:24:15 · 2579 阅读 · 0 评论 -
有序线性表的合并
例:已知线性表LA和LB中数据的元素按zhi原创 2014-04-19 21:55:17 · 1302 阅读 · 0 评论 -
数组的顺序表示和C语言实现
#include #include #include #ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSe 0#endif#ifndef OK#define OK 0#endif#ifndef ERROR#define ERROR 1#endif#define MAX原创 2014-04-26 00:29:39 · 1118 阅读 · 0 评论 -
稀疏矩阵的三元组顺序表的C语言实现
矩阵的三元组实现原创 2014-04-27 15:04:56 · 2886 阅读 · 0 评论