
数据结构与算法
文章平均质量分 54
Java C语言 类C语言
Java the world
自律者自清
展开
-
【数据结构】线性表的链式存储结构
todo: 释放内存失败/*线性表链式存储结构*/#include <stdio.h>#include <stdlib.h> //pause 的头文件#include <time.h> // 使用当前时钟做种子#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -1#define INIT_LISTSIZE 5 //链表的初始数据分配量#defin原创 2021-09-09 09:17:02 · 200 阅读 · 0 评论 -
【数据结构】顺序存储结构
注意定义的函数的顺序,后面调用前面 不能前面调用后面/*顺序存储结构*/#include <stdio.h>#include <stdlib.h> //pause 的头文件#include <time.h> // 使用当前时钟做种子#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 20 //存储空间最大分配量#define LIST_INITSIZE原创 2021-09-09 09:13:34 · 280 阅读 · 0 评论 -
【算法】排序_基数排序
算法部分模板[排序名称]排序定义稳定性时间复杂度代码测试用例int arr[] = {2,4,3,1,6,5};原代码 运行结果[pic]第一次优化第一次优化:当第n次没有数据交换时,结束循环 运行结果[pic]第二次优化每次一发生交换时,记录交换的位置,下面在循环的时候,只需要比较到上次最后两两交换的位置即可 运行结果[pic]交换函数 扩展:异或运算...原创 2021-08-25 20:15:14 · 137 阅读 · 1 评论 -
【算法】排序_汇总篇
总览冒泡排序定义重复地走访过要排序的元素,依次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换 即该元素列已经排序完成稳定性冒泡排序是一种稳定排序算法时间复杂度O(N2)代码测试用例int arr[] = {2,4,3,1,6,5};原代码 /** * 普通冒泡排序 * 缺陷:耗时 每次都会无条件遍历 * @param arr * @param len arr.length原创 2021-08-25 19:58:31 · 254 阅读 · 1 评论 -
【算法】排序_计数排序
参考文章计数排序定义计数排序是一种特殊的桶排序计数排序是一种非比较性质的排序算法,元素从未排序状态变为已排序状态的过程,是由额外控件的辅助和元素本身的值决定的。计数排序过程中不存在元素之间的比较和交换操作。根据元素本身的值,将每个元素出现的次数记录到辅助空间后,通过对辅助空间内数据的计算,即可确定每一个元素最终的位置稳定性稳定时间复杂度O(N+K) K为数值范围步骤根据待排序集合中最大元素和最小元素的差值范围,申请额外控件遍历待排序集合,将每一个元素出现的次数记录到元素值对应原创 2021-08-24 21:25:13 · 103 阅读 · 1 评论 -
【算法】排序_桶排序
参考文章桶排序(箱排序)定义桶排序的工作原理是将数组分到有限数量的桶中,每个桶再个别排序有可能使用别的排序算法或者以递归方式继续使用桶排序进行排序稳定性稳定时间复杂度平均时间复杂度:O(N + C)C = N * (logN-logM)N为待排数据,M为桶数量当N=M时,最好效率达到O(N)适用场合两个必要条件:最大最小值相差较大数据分布均匀,否则可能将数据集中到同一个桶中,便失去了桶排序的意义过程分析桶排序的基本思想:把数组arr划分为n个大小相同的子区间(桶),每个原创 2021-08-24 20:39:16 · 136 阅读 · 1 评论 -
【算法】排序_堆排序
堆排序定义堆排序是利用堆这种数据结构所设计的一种排序算法。堆是一种近似完全二叉树的结构,并同时满足堆积的性质:子结点的键值或索引总是小于(或者总是大于)它的父结点子结点的键值或索引值总是小于其父结点:大根堆子结点的键值或索引值总是大于其父结点:小根堆稳定性不稳定时间复杂度O(N*logN)建堆方法HeapInsert 上浮描述假定事先不知道有多少个元素,通过不断往堆里面插入元素进行调整来构建堆步骤增加堆的长度,在最末尾的地方加入最新插入的元素比较当前元素和它的父结点值,如果原创 2021-08-23 18:25:37 · 267 阅读 · 1 评论 -
【算法】排序_快速排序
算法部分模板快速排序定义基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分分别进行快速排序,整个排序过程可以递归进行,以达到整个数据变成有序序列稳定性不稳定时间复杂度O(N * logN)代码测试用例int arr[] = {2,4,3,1,6,5};原代码 /** * 快速排序 * @param arr * @param len */ publi原创 2021-08-19 15:22:50 · 111 阅读 · 1 评论 -
【算法】排序_归并排序
归并排序定义归并排序是采用分治法的一个非常典型的应用,将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子序列段间有序若将两个有序表合并成一个有序表,称为二路归并稳定性稳定时间复杂度O(N*logN)代码测试用例int arr[] = {2,4,3,1,6,5};原代码 /** * 归并排序(重载) * 为了创建临时数组 完成数组的复用 * * @param arr 无序数组 */ public st原创 2021-08-16 17:40:50 · 190 阅读 · 2 评论 -
【算法】排序_直接插入排序及其 优化(希尔排序)
插入排序定义插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的,个数加一的有序数据,直到全部插入完为止。适用于少量数据的排序稳定性稳定时间复杂度O(N2)代码测试用例int arr[] = {2,4,3,1,6,5};原代码 /** * 直接插入排序 * @param arr * @param len arr.length */ public static void insertSort(int[]原创 2021-08-13 18:12:36 · 127 阅读 · 1 评论 -
【算法】排序_选择排序及其优化
选择排序定义从待排序的数据元素中选出最小(或最大的一个元素),存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为0.稳定性不稳定时间复杂度O(N2)代码测试用例int arr[] = {2,4,3,1,6,5};交换函数 /** * 交换函数 * @param arr * @param i * @param j */ public原创 2021-08-12 15:36:37 · 137 阅读 · 1 评论 -
【算法】排序_冒泡排序及其优化
冒泡排序定义重复地走访过要排序的元素,依次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换 即该元素列已经排序完成稳定性冒泡排序是一种稳定排序算法时间复杂度O(N2)代码测试用例int arr[] = {2,4,3,1,6,5};原代码 /** * 普通冒泡排序 * 缺陷:耗时 每次都会无条件遍历 * @param arr * @param len arr.length原创 2021-08-11 15:16:19 · 124 阅读 · 1 评论 -
算法面试题(数据结构)
第二次面试题一、长度为n的链表 求倒数第k 个结点两次遍历先求出n的值(用一个循环)然后求n-k一次遍历 双指针同一个位置开始 间隔k-1当其中一个指针指到最后一个时,另一个就是所求二、(进一步延伸)123456 -》 561234将指向最后一个结点的指针指向第一个结点,成为循环链表,然后再断开链表 断开之前要获取到5的结点第三次数组:逆置 回文容器 (列表 字典 集合)求单链表中循环链表中的入环结点1.用集合 第一个出现两次的结点就是入环结点 缺点:借助了原创 2020-12-18 08:48:35 · 223 阅读 · 0 评论 -
数据结构——第十章 排序
概念排序内部排序:指的是待排序记录存放在计算机随机存储器中进行的排序过程(不考虑读写硬盘)。而外部排序指的是当排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。排序的稳定性:如果两记录Ri与Rj的关键字相同,在排序前Ri在Rj的前面,排序之后, Ri依然在Rj之前,我们称这种排序方法是稳定的,反之,是不稳定的。(排序过程中Ri与Rj的相对位置...原创 2020-01-05 11:17:13 · 416 阅读 · 2 评论 -
数据结构——第九章 查找
查找概念查找表:由同一类型的数据元素(或记录)构成的集合。对查找表进行的操作:查找 检索 增加 删除静态查找表:对查找表进行 查找 检索动态查找表:对查找表进行 查找 检索 增加 删除关键字:数据中某个数据项的值,用以标识一个数据元素主关键字:数据项的唯一标识次关键字:用以标识若干数据项查找是否成功:查找表 中是否存在平均查找长度(ASL)(查找成功时):为确定记录在查找表中的...原创 2020-01-04 20:10:37 · 374 阅读 · 0 评论 -
数据结构——栈
顺序存储#include <stdio.h>#include <stdlib.h>#include <string.h>#define STACK_INIT_SIZE 100//存储空间初始分配量#define STACKINCREMENT 10//存储空间分配增量#define OK 1#define ERROR 0#define SElemT...原创 2020-01-04 14:44:47 · 104 阅读 · 0 评论 -
数据结构——队列操作
线性表/*q.f中的数据域不存内容,q.rear的数据域中是有内容的*/#include<stdio.h>#include<stdlib.h>typedef struct Node{ int data; struct Node *next;}Node;typedef struct Queue{ Node *f,*r;}Q;void init(Q *q)...原创 2020-01-04 13:57:16 · 145 阅读 · 0 评论 -
数据结构——结构体总结
第二章 线性表线性表的动态分配顺序存储结构 P22#define int ElemType #define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量#define LISTINCREMENT 10 //线性表存储空间的分配增量typedef struct{ ElemType *elem;//存储空间基址 int length;//当前长度 ...原创 2020-01-03 19:25:47 · 575 阅读 · 1 评论 -
数据结构——一些小点
在堆排序和快速排序中,若原始记录接近正序或反序,则选用 堆排序若原始数据基本无序,则选用快速选择排序在直接插入和简单选择排序中,若初始数据基本有序,则选用 直接插入排序若初始数据基本无序,则选用 简单选择排序抽象数据类型与计算机内部的表示和实现无关(对)抽象数据类型 即 设计顺序存储方式只能用于存储线性结构(错)顺序存储结构也可以用来存储二叉树等树形...原创 2019-12-24 17:57:47 · 387 阅读 · 1 评论