数据结构
文章平均质量分 64
NPC的克星
这个作者很懒,什么都没留下…
展开
-
二维数组实现基数排序(c语言)
1.原理,基数排序是基于输入序列元素的键值来进行排序的,也是利用桶排序的思想,在确定的有限个桶内,按照基数的键值划分到不同的桶中,在该种排序中,输入序列的键值是有多个的,根据条件的不同,键值也不同。而且每次比较的键值的优先级也不一样。假设输入序列都是正整形元素的话,我们可以以个位数,十位数,百位数等分别进行三次划分元素进桶操作。而且当完成一轮的进桶操作之后,要将桶中元素依次放出并覆盖原输入序列。2.算法分析,要有确定的有限个桶来存储对应元素。这里我们采取二维数组keys_table[10][100]来充当原创 2022-02-09 16:09:10 · 1046 阅读 · 0 评论 -
C语言实现桶排序
1.原理,由映射函数分配初始元素的键值,然后将这些元素放入对应键值的桶中,并对桶中的数据进行排序。然后依次将每个桶中的元素分出得到排好序的序列。2.桶排序不是基于比较的排序。将N个待排序的元素放入桶中只需要O(n)时间。后续则是对桶中元素的排序,所以当桶越多的时候,桶中的元素会越少,所采取的基于比较的排序算法的时间则会大大减少。所以,这里我们就可确定了一个重点,即是桶的数量必须是有限个的,可以经过一系列运算得到具体数目的。3.桶的实现形式,我们以结构体数组存储单链表实现。以结构体数组的数组单元来春初链原创 2022-02-05 16:25:10 · 2949 阅读 · 0 评论 -
改进后的超自然合并排序算法
作者我的初衷是想编写一个自底向上的合并算法,但每次都要给排序函数子序列段的首尾坐标或者长度,还要分子序列段是奇数还是偶数,太麻烦了。于是我就想能不能事先存储要合并的各个要合并的子序列段的首尾坐标,然后两两配对之后删除在合并中第二个子序列段的相关信息,并给该次合并的第一个调子序列段调整尾坐标,使其表示合并后的新的子序列段。我是想用链表来存储,但一想到要分出两个值域去存储首尾坐标的话,加入数组很大,那么该链表至少也要跟数组这么大。典型的是利用空间换时间,而且转换效率还低。如图:于是我想转换另一种思路,链表的.原创 2021-12-04 19:09:39 · 339 阅读 · 0 评论 -
超详细解决自然合并排序问题
自然合并排序的原理:对于初始给定的数组a = {4,8,3,7,1,5,2,6};其中存在四个子序列段,分别是{4,8},{3,7},{1,5},{2,6}。然后将子序列段两两合并,如{3,4,7,8},{1,2,5,6}等更大的子序列段,直到子序列段为1。怎么确定一个子序列段?有两种方式,获取子序列段的首元素坐标和尾元素坐标,或获取首尾元素坐标之1和子序列段的长度,因为首尾元素坐标之差的绝对值就是子序列长度,这里我们采取第二种方式。那怎么获取子序列段的首坐标和长度呢?首先定义两个整型变量,分别记录首.原创 2021-12-03 20:14:19 · 911 阅读 · 0 评论 -
指针实现表(C语言)
用指针实现链表我的理解:指针实现的链表表类似一个数组,但又没有数组的固定大小,且在物理上不相邻。图示:表的几种操作1 创建节点:使用malloc函数,用法为(指针类型*)malloc(sizeof(指针类型)),并返回为分配的内存的地址。2插入节点(表尾插入):利用指针pr寻找表尾,找到后将地址赋给节点p,再对p节点中的数据域和指针域进行操作。3:删除节点:将要删除的节点前一个节点的指针域指向要删除节点的指针域。4:表的删除:每个节点free一次。#include原创 2021-10-31 15:19:37 · 199 阅读 · 0 评论 -
快速排序算法
冒泡排序:把元素看成一系列的气泡,小的在下,大的再上,再上升期间要相邻的气泡进行比对,大的数往上冒泡。最好的情况下(整个序列是已经排好序的),但仍要进行1/2 n2(等差数列的和)次比较,所以最好情况下的时间复杂度是O(n2),最坏情况下是整个数列完全为逆序,比较和交换都要进行1/2 n2次,总次数是n2次,时间复杂度是O(n2),平均复杂的也是O(n2)。插入排序,对一个序列(一开始里面包含的数只有1个)已经排好的序列插入一个数(假设在数组中从小到大排),序列外的元素首先与最大值比较,比最大值大的话存.原创 2021-11-25 23:27:07 · 333 阅读 · 0 评论 -
循环数组实现队列
队列:只允许在表尾(队尾)插入和在表首(队首)删除的表(也就是队首标只在插入入时变化,队尾标只在删除时变化)。又叫后进先出(LIFO)表。用数组循环实现队列,首先想象数组中的单元排列成一个圆,数组的头部和尾部相邻,而表在占用其中任意连续的一部分数组单元空间(而队尾队首标永远大于0且根据增加和删除的次数自加,所以这里存在一个数组越界问题)。接下来用Front指向表中元素的前一个位置,用Last指向表中元素的最后一个所在的数组位置。无论怎么安排Last和Front的初始指向位置,他俩的相对位置关系在表满和表.原创 2021-11-16 23:59:22 · 816 阅读 · 0 评论 -
指针实现栈
栈:是一种特殊的表,只在表头进行插入和删除。表首称为栈顶,表尾称为栈底。遵循先进后出原则。因为只在表土进行插入和删除,只记录了表头,所以查找也是从表头开始的。这些都是一些特殊化的表,所以关键理解表就掌握了这些特殊化的表了。代码如下:`#include<stdio.h>#include<stdlib.h>typedef int ListItem;typedef struct snode *Snode;typedef struct snode{ListItem ele.原创 2021-11-16 21:46:04 · 672 阅读 · 0 评论 -
C语言实现双链表
整体与单链表循环差异不大,关键是前增加的一个指针域,可以实现不同方向的循坏,在一些条件下来寻找最适合的循环方向可以有效减少查找的时间。这是它的优越性。也就是弥补了单链表查找速度慢的缺点。本文采用了书中的设置哨兵的做法,方便添加表头。代码如下:...原创 2021-11-15 21:19:38 · 1383 阅读 · 0 评论 -
单循环链表(C语言)
单向循环链表(C语言)实质:将表尾的next指向头部的Head,以此完成表的循环。查找优化:从表尾开始查找,这样查找表尾和表头的时间会大大缩短。避免了以表土为起点时,查找表尾需要O(n)时间来查找。整个表建立在指针实现表的基础上增加了表尾Last元素,和表头Head元素。...原创 2021-11-14 11:00:00 · 790 阅读 · 0 评论 -
游标实现表(C语言)
游标实习表(C语言)理解:游标实现表的实质是,用数组存储表的单元,表的单元包括元素域和next域(仿指针域),next域是用来指向表的下一个单元在数组中存储的的位置。怎么确定一个表的开头和结尾:假如数组的子集是称为单元,表的子集称为元素。首先我们要知道删除操作是进行的覆盖,而表头是表的起始点,所以无法覆盖,也就无法进行删除操作,所以一般来说,表头的一般在数组中的位置是固定的,往往是数组的第一个位置,除非你将表头的next域抹去,使其指向为空的数组单元或指向本身(此时表头变为原本表的第二个元素),原创 2021-11-13 16:55:03 · 697 阅读 · 0 评论