【数据结构】笔记
小与米
一只不懈努力的菜鸟,比较熟悉的语言C/C++,喜欢钻研算法 O(∩_∩)O哈哈~
展开
-
栈与递归
栈与递归 栈还有一个重要应用是在程序设计语言中实现递归. 一、采用递归算法解决的问题 所谓递归是指,若在一个函数、过程或者数据结构定义的内部又直接(或间接)出现定义本身的应用, 则称它们是递归的,或者是递归定义的. 在以下三种情况下, 常常使用递归的方法.1.定义是递归的 很多数学函数是递归定义的, 如大家熟悉的 阶乘函数原创 2015-11-25 12:05:28 · 2409 阅读 · 0 评论 -
排序算法小结
最近刚好有空,所以打算全面的看一遍排序,故先总结一下之前和最近看的一些排序算法。排序的基本概念和排序方法概述一、排序的基本概念1.排序 首先来看一下排序的基本概念,排序(Sorting)是按关键字的非递减或非递增顺序对一组记录重新进行排列的操作。2.排序的稳定性 这是一个重要的性质,当排序排序记录中的关键字Ki(i=1,2,...,n)都不相同时,则任原创 2015-12-15 23:29:42 · 655 阅读 · 0 评论 -
【基数排序】
基数排序(Radix Sorting) 基数排序是和前面所述各类排序方法完全不相同的一种排序方法。前述各类排序方法都是建立在关键字比较的基础上,而基数排序不比较关键字的大小,它是根据关键字中各位的值,通过对待排序记录进行若干趟“分配”与“收集”来实现排序的,是一种借助于多关键字排序的思想对单关键字排序的方法。一、多关键字的排序先看一个具体例子。已知扑克牌中52张牌的次序关系为原创 2015-12-16 18:52:07 · 745 阅读 · 0 评论 -
【选择排序】堆排序
堆排序(Heap Sort) 从简单选择排序可见,选择排序的主要操作是进行关键字间的比较,因此改进简单选择排序应从如何减少“比较”出发考虑。显然,在n个关键字中选出最小值,至少进行n-1次比较,然而,进行在剩余的n-1个关键字中选择次小值并一定要进行n-2次比较,若能利用前n-1次比较所得信息,则可减少以后各趟排序中所用的比较次数。 堆排序就是基于这种思想,对简单选择排序进行了原创 2015-12-16 16:08:09 · 2911 阅读 · 0 评论 -
【插入排序】直接插入排序
直接插入排序(Straight Insertion Sort)[算法思想]1)设待排序的记录存放在数组r[1..n]中,r[1]是一个有序序列.2)循环n-1次,每次使用顺序查找法,查找r[i](i=2, ... ,n)在已排好序的序列r[1..i-1]中的插入位置,然后将r[i]插入表长为i-1的有序序列r[1..i-1],直到将r[n]插入表长为n-1的有序序列r[1..n原创 2015-12-15 00:00:34 · 779 阅读 · 0 评论 -
【插入排序】折半插入排序
折半插入排序(Binary Insertion Sort) 直接插入排序采用顺序查找法查找当前记录在已排好序的序列中插入位置,这个“查找”操作可利用“折半查找”来实现,由此进行的插入排序称之为折半插入排序(Binary Insertion Sort)。[算法思想]1)将待排序的记录存放在数组r[1..n]中,r[1]是一个有序序列。2)循环n-1次,每次使用折半查找法,查找原创 2015-12-15 12:54:10 · 1009 阅读 · 0 评论 -
【插入排序】希尔排序
希尔排序(Shell’s Sort) 希尔排序又称“缩小增量排序”(Diminishing Incerment Sort),是插入排序的一种,因D.L.Shell于1959年提出而得名。直接插入排序当待排序的记录个数较少且待排序序列的关键字基本有序时,效率较高。希尔排序基于以上两点,从“减少记录个数”和“序列基本有序”两个方面对直接插入排序进行了改进。[算法思想]原创 2015-12-15 14:31:11 · 973 阅读 · 0 评论 -
【交换排序】冒泡排序
冒泡排序(Bubble Sort) 冒泡排序是基于交换排序的一种排序,交换排序的基本思想,是两两比较待排序记录的关键字,一旦发现两个记录不满足次序要求时则进行交换,直到整个序列全部满足要求为止。冒泡排序是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上“漂浮”(左移),或者使关键字大的记录如石块一样逐渐向下“坠落原创 2015-12-15 18:01:06 · 833 阅读 · 0 评论 -
【选择排序】简单选择排序
选择排序的基本思想是:每一趟从待排序的记录选出关键字最小的记录,按顺序放在已排序的记录序列的最后,直到全部排完为止。 简单选择排序(Simple Selection Sort)也称作直接选择排序。[算法思想]1)设待排序的记录存放在数组r[1..n]中。第一趟从r[1]开始,通过n-1次比较,从n个记录中选出关键字最小的记录,记为r[k],交换r[1]和r[k]。2)第二趟从原创 2015-12-16 13:35:31 · 1244 阅读 · 0 评论 -
【交换排序】快速排序
快速排序(Quick Sort) 快速排序是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个(不相邻)记录的依次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可能消除多个逆序。[算法思想] 在待排序的n个记录中任取一个记录(通常取第一个记录)作为枢轴(或支点),设其关键字为piv原创 2015-12-09 19:23:46 · 857 阅读 · 0 评论 -
【散列表】哈希表
散列表(hash table) 散列表,也叫哈希表,是实现字典操作的一种有效数据结构。尽管最坏情况下,散列表中查找一个元素的时间与链表中查找的时间相同,达到O(n),然而实际应用中,散列查找的性能是极好的。在一些合理的假设下,在散列表中查找一个元素的平均时间是O(1)。是普通数组概念的推广,在散列表中不是直接把关键字key作为数组下标,而是根据关键字计算出相应下标。在构造散列函原创 2015-12-10 13:25:05 · 1105 阅读 · 0 评论 -
二叉树的遍历
遍历二叉树(traversing binary tree)1.遍历二叉树的描述 遍历二叉树是指按某条搜索路径巡访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。遍历二叉树是二叉树最基本的操作,也是二叉树其他各种操作的基础、遍历的实质是对二叉树进行线性化的过程,即遍历的结果是将非线性结构的树中结点排成一个线性序列。1.先序遍历二叉树的操作定义如下:若二叉树为空,则原创 2015-12-04 20:02:52 · 1024 阅读 · 0 评论 -
二叉树的线索化
线索二叉树(Threaded BinaryTree)1.线索二叉树的基本概念 遍历二叉树是以一定规则将二叉树中的结点排列成一个线性序列,得到二叉树中结点的先序序列、中序序列或后序序列。这实质上是对一个非线性结构进行线性化操作。使每个结点(除第一个和最后一个外)在这些线性序列中有且仅有一个直接前驱和直接后继。 例如二叉树结点的中序序列a+b*c-d-e/f中,“c”原创 2015-12-05 19:33:13 · 28850 阅读 · 14 评论 -
数组与链表的区别
数组 数组,即线性表的顺序表示,指的是用一组地址连续的存储单元依次存储线性表的数据元素,其特点是逻辑上相邻的数据元素,其物理次序也是相邻的。假设线性表的每个元素需占用k个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。线性表中第i+1个元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足下列关系 LOC(ai+1)=LOC(ai)原创 2015-12-12 13:18:29 · 351 阅读 · 0 评论 -
链表的基本功能实现
前言 : 链表的实现,查询,插入,删除,这些简单的操作。在平时的学习中,经常会遇见,故以单链表为例做个总结。链表的优缺点,以及适用情况在前面的一篇文中(http://blog.csdn.net/c18219227162/article/details/50274243)就提到过,就不作介绍了。一、链表的定义单链表存储结构typedef struct LNode{原创 2015-12-12 19:48:48 · 718 阅读 · 0 评论 -
栈的应用
栈的应用1.数制的转换[问题描述]十进制数N和其他d进制数的转换时计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理:N=(N div d)*d +N mod d (其中,div为整除运算,mod为求余运算)例如:(1348)10=(2504)8,其运算过程如下:N N div 8 N mod 8 1348原创 2015-11-24 14:21:20 · 895 阅读 · 1 评论 -
字符串的倒序
1.单词(字符串)翻转 1205 单词翻转 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 给出一个英语句子,希望你把句子里的单词顺序都翻转过来输入描述 Input Description输入包括一个英语句子。输出描述 Output Description按单词的顺序把单词原创 2015-11-29 00:43:40 · 646 阅读 · 0 评论 -
字符串的处理
[问题描述][解题思路] 读取字符串时,用scanf()读入,会自动忽略空格,根据字符串的内容来判断是否大写,如果是第一个字母,则默认其前面有一个'.',故大写;如果',','!'后面是小写字母,则变为大写字母 。 输出时,两个字符串之间,再添加一个空格 [代码实现]原创 2015-11-29 01:58:45 · 277 阅读 · 0 评论 -
字符串匹配算法(BF和KMP)
一、BF算法 最简单直观的模式匹配算法是BF(Brute-Fore)算法.[算法思想] 从主串S的第pos个字符起和模式的第一个字符进行比较,若相等,则进行逐个比较后续字符;否则从主串的下一个字符起再重新和模式的字符比较.依次类推,直至模式T中的每个字符依次和主串S中的一个连续的字符序列相等,则匹配成功,函数返回值为和模式T中第一个字符相等的字符在主串S中的序号,否原创 2015-11-28 20:20:00 · 703 阅读 · 0 评论 -
栈的实现
栈的实现一、栈的类型定义 栈(Stack)是限定仅在表位进行插入或删除操作的线性表. 因此, 对栈来说, 表尾端有特殊含义, 称为栈顶(top), 相应地, 表头端称为栈底(bottom). 栈是后进先出(Last In First Out)的线性表(简称LIFO结构),栈的特点可以用铁路调度站形象地表示.在程序设计中, 如果需要安装保存数据时相反的顺序来使用数据, 则原创 2015-11-27 11:05:04 · 537 阅读 · 0 评论 -
队列的实现
一.循环队列-队列的顺序表示和实现/*顺序队列的类型定义*/#define MAXQSIZE 100 /*最大队列长度*/#define OK 1;#define ERROR 0;typedef struct {int *base; /*初始化的动态分配存储空间*/int front; /*头指针*/int rear; /*尾指针*/}SqQueue原创 2015-12-03 13:09:52 · 518 阅读 · 0 评论 -
二叉树的定义、性质
一、二叉树的定义 二叉树是一种特殊的树结构,也是常用的树结构。二叉树的存储和处理比一般的树简单,同时一般的树都能通过简单的转换得到与之对应的二叉树,这样就可以采用二叉树的存储结构和有关算法来解决树的有关问题。 二叉树与树一样具有递归性质,它与树的区别主要有以下两点:1)二叉树的每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点)2)二叉树的子树有左右之分,其次原创 2015-12-04 00:42:21 · 677 阅读 · 0 评论 -
【归并排序】
归并排序就是将两个或两个以上的有序表合并成一个有序表的过程。将两个有序表合并成一个有序表的过程称为2-路归并。归并排序算法的思想是:假设初始序列含有n个记录,则可看成n个有序的子序列,每个字序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,...,如此重复,直到一个长度为n的有序序列为止。例 已知待排序记录的关键字序列为{49,38,65,97,7原创 2015-12-09 17:14:08 · 679 阅读 · 1 评论