
数据结构
zhangwang010
这个作者很懒,什么都没留下…
展开
-
数据结构:线性表之顺序表
数据结构:线性表之顺序表需求:实现线性表的数组方式实现,功能:实现数组表的增删改查实现:将各个功能单独封装到函数初始化:由于数据都不是在主函数中创建,出函数后无法使用。所以元素和元素集合(person and men)使用动态内存创建。增:将person结构体封装到men结构体中,以指针数组方式存储,每次添加一个元素并记录表长,删:删除元素,并移动元素填补空位。更新表长。释放内存。时间复杂度原创 2017-05-30 12:35:34 · 433 阅读 · 0 评论 -
二叉树的数组存储及运算
二叉树的数组存储//this is tree node size#define SIZE 20//求深度//对于一个数组结构的tree,要先求tree的深度x,求最大指数2^x-1=size = 2^x = size+1 x = log2 (size+1)int getHeight2(int size){ return (int)ceil(log10((double)size+1)/原创 2017-06-18 12:05:51 · 5739 阅读 · 0 评论 -
基数排序(radixSort)
基数排序基数排序算法的思想很有趣,他不依靠比较排序。而是采用分配式排序。基数排序也称为桶排序。原理准备10个容器,编号0-9,对应数字0-9。 然后按待排序元素的某一位的数字将其存放到对应容器中(数字相同), 再将容器中的元素从0号开始顺序收集合并,然后再从下一位开始…这里假设数组元素都是3位数。从个位开始,将数组中的元素按个位数字放入对应的桶中,再从桶中顺序取出到数组,这是数组按个位数原创 2017-08-30 15:32:58 · 378 阅读 · 0 评论 -
快速排序:Quicksort(2)
快速排序(1)快速排序是一种不稳定的原地交换排序(据说可以改进),其平均时间复杂度是 O(nlogn)。最坏情况下是O(n^2)。当数组已是有序或接近有序时,是最坏的情况。在示例算法中,总是选取当前块的第一个元素作为key,当数组已经有序时,一趟排序总是把数组分成一个元素和其他元素两部分(没有发挥分治的效果)。这时对n个元素的数组的排序要操作的次数是 n!。所以要避免最坏的情况,key的选择至关重要原创 2017-08-30 15:03:04 · 295 阅读 · 0 评论 -
插入排序
原理分析(升序)假定数组第一个数是有序的,从数组下标1开始遍历比较后面的数值。如果遍历到的数x小于排在它前面的数则交换他们,再比较x和x前面的数…直到x前面再也没有比它大的数了,这时x就移动到了有序队列的合适位置。上述比较称为插入。 《算法导论》里的比喻很合适:“插入排序就像玩扑克牌时的抓牌一样,抓一张牌,就把它插在已有扑克牌的合适位置” 注:从数组的第二个数(下标1)开始遍历就是假设第原创 2017-07-18 15:08:55 · 192 阅读 · 0 评论 -
归并排序
简单分析:归并排序是典型的用分治思想解决问题的算法, 其基本思想是: 有两个有序数组,从两个数组首端开始比较。将较大或较小的元素加入一个空数组中,同时在原数组中删除。剩下的元素如此重复。最后就将两个有序数组合并成一个有序数组了。这样的过程成为归并。与分治法结合在一起来考虑。如果不断递归拆分数组,直到拆分到最后只有两个元素了,也就是说把一个数组分成两边,一边只有一个元素,这是两边自然是有序的,满足有序原创 2017-07-18 14:45:46 · 239 阅读 · 0 评论 -
交换排序
简单描述交换排序是指通过比较键值的大小来交换这两个元素的位置,实现排序. 常见的交换排序有冒泡排序和快速排序. 冒泡排序的时间复杂度度是 O(n^2), 快速排序的时间复杂度度是 O(nlogn), 快速排序是对冒泡排序的改良.但是快速排序是不稳定的冒泡排序原理: 通过比较相邻两个数的大小来决定是否交换。 一轮比较下来,最右边的数就是最大或最小的,假设数组size=n,则需要n-原创 2017-07-18 14:26:30 · 319 阅读 · 0 评论 -
Huffman树
问题的由来:有一组带权节点组成的森林,每个棵树都只有一个节点,其权值是被访问的概率.那么将这个森林合并为一颗二叉树,如何使根节点到这些节点的路径最短(优)?这样的树也叫判定树或选择树,而Huffman树是是判定树的最优实现.Huffman 树实现原理在森林中每次取两个权值最小的节点,用这两个节点的权值相加得到一个新节点,并成为其的左右子节点.构成一个新的二叉树.重复上述步骤,直到只剩一棵树.这颗树原创 2017-07-07 16:40:07 · 339 阅读 · 0 评论 -
数据结构:线性表之单链表
单链表实现链表特点:链表是指一个数据元素含有一个或多个指向另外一个数据元素的指针或引用。称这样的元素为节点。一条链上的节点,多形象。 链表结构的元素在内存中是分散存放的。不需要连续的存储空间。空间利用率较高。可以动态增加长度。而由于元素是通过指针联系在一起的,所以插入和删除元素较快,只需要修改插入和删除位置元素的指向即可。这些是链表的优势。链表的劣势是对元素的访问只能遍历寻找(不包含特殊指向原创 2017-06-02 23:05:50 · 380 阅读 · 0 评论 -
矩阵压缩存储
对称矩阵的压缩实现原理c二维数组存储在c中矩阵的表示是用二维数组。那么首先要搞清楚数组行列与矩阵行列的对应。在c语言中二维数组是按行存储的。即顺序存储每一行。(第一行,第二行。。。最后一行) 看一下例子:数组数量替换成arrs[i][j],方便说明。int arrs[i][j] = {{1,2,3}, {1,2,3}, {1原创 2017-06-11 11:04:01 · 808 阅读 · 0 评论 -
线性表之数组实现栈结构
用数组实现栈结构实现栈结构的数组实现是用一个一维数组存放数据,数据每次从队尾加入,删除时也从队尾删除,要实现这种增删操作需要使用一个记录下标的指针(top)来指向栈顶。当添加元素时添加到 arr[top+1]位置,当要做删除操作时 使top–;指向倒数第二个元素,使其称为新栈顶。旧栈顶则被忽略,当其所占空间要使用时直接覆盖即可。栈与递归栈是一种很常用的结构,比如函数调用就使用栈结构,当程序执行到函数原创 2017-06-10 11:14:02 · 226 阅读 · 0 评论 -
线性表之队列
队列的数组实现要使用模运算,关于模运算,请参加(...先挖个坑)。其实现原理是通过模运算使数组形成循环。这样就不用因为删除元素而移动数组了。就是数组的任意位置都可以是队列头和尾,这样当要求一个head+1后的位置的算法是:head = (head+1)模数组长度。要求一个下标-n后的位置的算法是:新下标 = 旧下标+(数组长度-n)模数组长度。原创 2017-06-10 17:08:47 · 292 阅读 · 0 评论 -
线性表之链表实现栈结构
用链表实现栈结构栈结构简单介绍栈结构通俗来说是元素先进后出,就像一个水瓶,依次往里装东西,最先装进去的被压在下面,要出来时得先拿走上面压着的东西,才能取出来。所以说栈是运算受限的线性表,因为栈只允许在表的一端进行增删。实现 本文使用单链表来实现栈结构。先构建一个带head 节点的链表,每次添加元素(进栈),使新节点->next指向head->next,使head节点指向新节点。数组结构的实现见下一原创 2017-06-08 21:44:16 · 366 阅读 · 0 评论 -
线性表之双链表
明天再写#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct person2{ char name[10]; int age; struct person2 *next; struct person2 *last;}person2;typedef struct linkedL原创 2017-06-02 23:09:40 · 334 阅读 · 0 评论 -
二叉树的链表实现
二叉树的链表实现在构建二叉树时使用完全二叉树的特性,所以构建的是一颗完全二叉树打印二叉树打印完全二叉树要使用队列结构保存序列。将根节点存入队列,然后在while循环中将队列的第一个元素出队并将其右孩子和左孩子依次入队(如果不为null),这样的入队的顺序就按层按从左到右的顺序,出队亦是。所以可以通过调整入队顺序改变遍历顺序.以此循环遍历root及其子树,循环的条件是队列不为null.//print原创 2017-06-18 11:56:14 · 376 阅读 · 0 评论 -
树的定义及术语
树(tree)的定义简单讲:树就是树,是颜色不一样的烟火…(手动微笑)关于树的术语(摘自百度百科) http://baike.baidu.com/link?url=g8V1zMAkQ9cMVxsUJZZpJRT0iBkinqBJWqOUl789tfC3ufE4KvrsHfmwv-2phN9uSYfSeOuAU3QIXvZ2uSTbE2zOFbS55yPr1vc6uU3xHPa节点的度:一个节点含原创 2017-06-18 11:04:12 · 1080 阅读 · 0 评论 -
堆排序(heapsort)
堆排序堆排序是利用堆结构(特殊的完全二叉树)实现排序的算法,时间复杂度是O(nlogn)。堆排序不稳定。原理堆排序要构建一颗完全二叉树(存储在数组,详见: 二叉树的数组存储),这颗二叉树就是堆。堆有大堆和小堆两种(结构类似)。这里以大堆为例。 在最大堆中每个节点都比子节点大,根节点最大,每个分枝都是一个堆,叶子节点天然就是堆。 构成一个堆之后。然后取堆首-重新构建堆-再取… 元素按大到小依次取出原创 2017-08-30 16:11:34 · 321 阅读 · 0 评论