数据结构与算法分析
以《数据结构与算法分析——C语言描述》《数据结构(C语言版)》这两本书为蓝本,全面的分析常用的数据结构及算法,并给出解释和程序
懒人李冰
音视频编解码
展开
-
算法学习之查找算法:静态查找表(2)有序表查找
如果静态查找表是一个有序表,则可以使用折半查找。 折半查找的过程是:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者查找区间的大小小于零时(表明查找不成功)为止。 关键字key与原创 2014-09-24 20:57:55 · 2133 阅读 · 0 评论 -
算法学习之查找算法:静态查找表(1)顺序表查找
引言: 查找表一般原创 2014-09-22 06:44:17 · 4124 阅读 · 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 · 1776 阅读 · 1 评论 -
算法学习之排序算法:归并排序
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。无论是顺序存储还是链表存储结构,都可在O(m+n)的时间量级上实现。 归并排序又是一类不同的排序方法。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个为2或1的有序子序列;再两两归并,....... ,如此重复,直至得到一个长度为n的有序序列为止。初始关原创 2014-09-13 09:12:37 · 1418 阅读 · 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 · 1494 阅读 · 2 评论 -
算法学习之排序算法:快速排序
快速排序:快速排序是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。一趟快速排序的具体做法:1、附设两个指针low和high,它们的初值分别为low和high,设枢轴记录的关键字为pivotkey。2、首先从high所指位置起向前搜索找到第一原创 2014-09-11 09:15:20 · 1625 阅读 · 0 评论 -
算法学习之排序算法:冒泡排序
冒泡排序:不同于插入排序,冒泡排序主要通过“交换”来完成。基本思想:1、将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(Record[1].key > Record[2].key),则将两个记录 交换之,然后比较第二个记录和第三个记录的关键字。2、依次类推,直至第n-1个记录和第n个记录的关键字被安置到最后一个记录的位置上。完成第一趟冒泡排序。结果使原创 2014-09-07 07:25:07 · 1655 阅读 · 0 评论 -
算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)
引言: 插入排序作为最简单易于理解的排序算法,基本实现比较简单。本文详细介绍直接插入排序,并给出实现,简单的介绍折半插入排序,并给出2-路插入排序和表插入排序两种插入排序,但并未给出具体实现。一、直接插入排序 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。原创 2014-09-07 06:03:45 · 2156 阅读 · 0 评论 -
算法学习之排序算法:希尔排序
希尔排序又称“缩小增量排序”,它的基本思想是:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对记录进行一次直接插入排序。 希尔排序的一个特点是:子序列的构成不是简单地“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。这就使得希尔排序中关键字较小的记录不是一步一步地往前挪动,而是一次按照“增量”的大小跳跃式地往前移,从而使原创 2014-09-06 23:50:10 · 1826 阅读 · 0 评论 -
七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。因此排序掌握各种排序算法非常重要。对下面介绍的各个排序,我们假定所有排序的关键字都是整数、对传入函数的参数默认是已经检查好了的。只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨。基础知识:原创 2014-07-16 08:01:40 · 10111 阅读 · 10 评论 -
静态查找表:顺序查找、折半查找、分块查找
引言: 除去各种线性和非线性的数据结构外,还有一种在实际应用中大量使用的数据结构——查找表。查找表是由同一类型的数据元素构成的集合。 对查找表经常进行的操作有:1、查找某个"特定的"数据元素是否在查找表中;2、检索某个"特定的"数据元素的各种属性;3、在查找表中插入一个数据元素;4、从查找表中删去某个数据元素。对查找表只作前两种统称为"查找"的操原创 2014-07-16 07:55:55 · 4865 阅读 · 0 评论 -
队列——数组实现
引言: 队列的实现除了链表外,也可用数组实现。分析描述: 队列的结构:typedef int ElementType;typedef struct QueueRecord{ int Capacity; int Front; int Rear; int Size; ElementType *Array;}QueueRecor原创 2014-07-10 18:26:50 · 1334 阅读 · 0 评论 -
队列——链表实现
引言: 队列与栈的区别是队列是先进先出的数据结构。为了使得出入队列容易,可以引入队列头指针和队列尾指针。分析描述: 队列的结点结构。typedef int QElemType;typedef struct QNode{ QElemType data; struct QNode *next;}QNode, *QueuePtr;原创 2014-07-09 13:38:52 · 1858 阅读 · 0 评论 -
栈——数组实现
引言: 使用链表实现栈存在“对malloc和free的调用开销昂贵”的缺点,特别是与指针操作的例程相比尤其如此。利用数组实现栈可以避免了指针。但它的缺点是可能存在空间的浪费。分析描述: 数组栈的结点元素。#ifndef ERROR#define ERROR (0)#endif#ifndef OK#define OK (!原创 2014-07-09 10:24:51 · 1216 阅读 · 0 评论 -
栈——链表实现
引言: 栈是先进后出的数据结构类型。在许多应用中也会经常用到,比如迷宫的求解时会用到栈结构。掌握栈的基本操作对于解决问题,有很大的帮助,尤其是编程中经常用到的递归的思想,就是栈的一个例子。分析描述: 栈的实现有两种方法,一种是用链表来完成。这种方法比较简单,我们先掌握这种方法。另一种是用顺序表(即数组)来实现栈。下一节原创 2014-07-09 09:31:45 · 1007 阅读 · 0 评论 -
双向链表
引言: 单链表存在一个问题,当我们想要访问某个结点的前一个结点时,要从头结点开始访问。显然这样的操作是令人烦躁的。为此,双向链表出现,它比单链表多出了一个指针域,指向前一个结点。这样,对于双向链表,就可以方便的从后向前遍历链表了。但多出的问题是对于插入和删除结点的开销要增加一倍。分析描述: 双向链表存储结构图为:,用结构体表示如下:原创 2014-07-08 22:39:54 · 1037 阅读 · 0 评论 -
单链表
引言: 数据结构中,很重要的一个结构就是链表。链表虽然简单,但却能很好的考查程序员的基本功,因此在很多面试、笔试中会直接或间接的考查它。下面就对链表进行系统的复习。分析描述: 下面就对链表的构建、删除、插入、查找、求长等操作进行系统描述。并给出程序代码。其中结点的定义如下:typedef int ElementType;typede原创 2014-07-08 19:49:28 · 1146 阅读 · 0 评论 -
最大公约数问题
引言:最大公约数就是给出两个数,找出它们的最大公约数。该问题算法实现技巧性比较强,面试中常出现,现在分析之。问题描述:给出两个正整数A、B,求出这两个正整数的最大公约数。算法一:更相减损术更相减损术又称“等值算法”,由我国古代《九章算术》中提出。描述如下:“以少减多,更相减损,求其等也,以等数约之,等数约之,即除也,其所以相减者皆等数之重叠,故以等数约之。”就是原创 2014-07-06 11:32:58 · 1211 阅读 · 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 · 1043 阅读 · 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 · 1194 阅读 · 0 评论