数据结构和算法
买代码的小猪猪
不断学习,分享技术
展开
-
算法程序设计部分总结
第四章 分治算法快速排序(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排原创 2022-04-15 08:52:59 · 305 阅读 · 0 评论 -
堆排序习题
写出下列关键字序列排序的结果:{15,21,6,30,23,6,20,17}步骤:先对序列进行堆排队,之后将顶部元素与最后一个元素相交换,交换时候重新对剩下的再进行一次堆排序。循环往复结果:剩下的排序:...原创 2021-08-24 10:56:24 · 1277 阅读 · 0 评论 -
排序算法---堆排序
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了 ...原创 2021-08-24 10:19:46 · 42 阅读 · 0 评论 -
快速排序
快速排序:利用的是分治思想,先取出序列中的第一个元素,把序列中大于它的放到右边,小于它的放到左边,这样这个数就排序好了,之后利用分治思想,从刚才排序好的元素位置进行分开,在两个小的序列中继续排序,直到序列长度为1;具体步骤:1.每次选取第一个数为基准数;2. 然后将大于和小于基准的元素分别放置于基准数两边;3. 继续分别对基准数两侧未排序的数据使用分治法进行细分处理,直至整个序列有序。#include<stdio.h>#include<Windows.h>in.原创 2021-03-29 15:42:46 · 73 阅读 · 0 评论 -
归并排序
归并排序:思想是分治法,将序列排序的问题分解成一个一个的小问题,先解决小问题,即使每个子序列有序,再使整个序列有序。#include<Windows.h>#include<stdio.h>#include<stdlib.h>void mergeAdd(int arry[], int left, int mid, int rigth, int* temp);void mergeSort(int arry[], int left, int rigth, int.原创 2021-03-28 16:39:30 · 51 阅读 · 0 评论 -
希尔排序
希尔排序:就是插入排序的升级版。先通过一个间距来划分开小组,然后对每一组都进行插入排序,之后缩小间距,再对新的小组进行排序依次进行,直到间距为1,那么就是普通插入排序了,这样避免元素移动过多。即:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1时,整个文件恰被分成一组,算法便终止。#include<stdio.h>#include<Windows.h>int main() { int.原创 2021-03-27 10:48:23 · 41 阅读 · 0 评论 -
插入排序
插入排序:就是先将第一个值看成一个有序的数组,将第二个值往这个数组里面插,依次直到最后一个值即:它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动#include<stdio.h>#include<Windows.h>int main() { int high[] = { 175,167,180,178,1.原创 2021-03-27 09:30:21 · 43 阅读 · 0 评论 -
冒泡排序
冒泡排序:就是从头开始两两进行比较,如果前面的大于后面的那就交换位置,比较完一轮后,最大的就放在了最后的位置上,之后开始第二轮,依次进行。#include<stdio.h>#include<Windows.h>int main() { int high[] = { 175,167,180,178,162,165,174,173,170,182 }; int len = sizeof(high) / sizeof(high[0]); for (int i = 0;i .原创 2021-03-27 08:47:15 · 129 阅读 · 0 评论 -
选择排序
选择排序的思想:通过比较数组中的值,将最大(最小)的值放到第一个位置,之后再将次大(次小)的放在第二个位置,依次直到最后一个#include<stdio.h>#include<Windows.h>int main() { int high[] = {175,167,180,178,162,165,174,173,170,182}; int len = sizeof(high) / sizeof(high[0]); for (int i = 0;i < len .原创 2021-03-26 21:48:39 · 48 阅读 · 0 评论 -
五大常规算法---贪心算法
贪心算法:根据名字可以知道,它是通过找局部最优解,从而达到整体的靠近最优的解。即:贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有 利)的选择,从而希望能够导致结果是最好或者最优的算法。例题:1元.2元,5元,10元,20元,50元,100元的纸币分别有10,2,3,4,5,2,1张,现在用这些钱来支付K元,至少需要多少张纸币?本题的解决思路:本题可以利用贪心算法,即先使用最大的纸币,再使用小的纸币。#include<stdio.h>.原创 2021-03-25 19:10:39 · 205 阅读 · 0 评论 -
五大常规算法---回溯法(判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以 从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。)
回溯法: 利用的是深度遍历的思想,探索每一条路径。***先从第一次节点开始,不断的探索,如果符合就沿着节点继续探索下去,所否退回上一个节点,探索上一个节点的其他路径。例题:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如在下面的 3×4 的矩阵中包含一条字符串“bfce”的路径(路径中的字母用下划线标出)。但矩阵中不...原创 2021-03-25 08:45:23 · 176 阅读 · 0 评论 -
五大常规算法---动态规划法
动态规划法:它与分治算法的思想相同,但是不同的点在于:分治算法是,将大问题,分解成小问题,小问题解决了,合并解决大问题。动态规划是,将大问题分解成小问题,将小问题解决后,将小问题的解,放到一个容器中(比如数组),这样求解大问题的时候,就可以直接用,避免重复计算。例题:如果一个人一次可以上 1 级台阶,也可以一次上 2 级台阶。求这个人走一个 n 级台阶总共有多少种走法?解决方法:不同于分治算法,使用动态规划,将最小的台阶数放到数组中,之后求高级台阶时,直接调用就好。#include<.原创 2021-03-23 15:41:44 · 394 阅读 · 0 评论 -
五大常规算法---分治法
分支法:分:递归解决较小的问题治:然后从子问题的解构建原问题的解二分查找的核心思想:先判断中间的数据与要查找的数据,之后根据在通过递归将问题缩小,根据大小判断在中间数据的左侧查找还是在右侧查找.#include<stdio.h>#include<Windeos.h>int BinSearch(int arry[],int key,int left,int right);int main() { int arry[10] = {1,2,3,4,5,6,7,8..原创 2021-03-23 13:57:30 · 220 阅读 · 0 评论 -
数据结构---图(邻接列表)
> 图: 在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。结构体:首先一个顶点有两个数据,一个是数据,一个是边。然后边里包括定点连接的哪条边,权重,顶点的下一条边。之后就是定义图了,图里包括指向所有顶点的指针,顶点的个数以及边。visted用来保存该节点是否被访问过。bool visted[1024];typedef struct _EdgeNode { int adj; int .原创 2021-03-20 20:21:38 · 884 阅读 · 0 评论 -
数据结构---哈希顺序表
哈希顺序表的结构:先建立一个数据,它用来存放数据和键值。再建立一个顺序表,里面存放数据和该顺序表的大小最后建立哈希表,哈希表中有指向数组表的指针(哈希桶)和组的多少typedef struct sq{ int key; int shu;}Data;typedef struct sq_list { Data *data; int length;}sq_List;typedef struct HASH { int size; sq_List* List;}Hash;初始化:先原创 2021-03-16 13:20:28 · 657 阅读 · 0 评论 -
数据结构---哈希表
* 哈希表关键特征:*键(key): 组员的编号 如, 1 、 5 、 19 。 。 。值(value): 组员的其它信息(包含性别、年龄和战斗力等)索引: 数组的下标(0,1,2,3,4) ,用以快速定位和检索数据哈希桶: 保存索引的数组(链表或数组),数组成员为每一个索引值相同的多个元素哈希函数: 将组员编号映射到索引上,采用求余法 ,如: 组员编号 1哈希表的主要思想就是,将数据进行分组,然后通过哈希函数找到该数据在哪个组,进行快速的查找。结构体:先定义节点,之后再定义哈希表原创 2021-03-15 16:37:26 · 141 阅读 · 0 评论 -
数据结构---树(二叉搜索树)
二叉树特点:最多只有两个节点,左边的分支称之为左节点,右边的分支称之为右节点。(1) 在非空二叉树中,第 i-1 层的结点总数不超过 , i>=1;(2) 深度为 h-1 的二叉树最多有 个结点(h>=1),最少有 h 个结点;(3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为 2 的结点总数为 N2,则 N0=N2+1;二叉搜索树特点:又称二叉查找树、二叉排序树。它是一颗空树或是满足下列性质的二叉树:1)若左子树不空,则左子树上所有节点的值均小于或等于它的根节点的原创 2021-03-12 13:49:15 · 142 阅读 · 0 评论 -
数据结构---链式栈
链式栈与链式队列相似,只是看成了在头结点插入,头结点删除 ,其核心是让相信节点指向头结点,头结点再指向新节点。#include<iostream>#include<Windows.h>using namespace std;#define MAX 50typedef struct _node { int date; struct _node* next;}LinkNode;typedef LinkNode* StackPtr;typedef struct Li.原创 2021-03-08 13:39:04 · 64 阅读 · 0 评论 -
数据结构---栈
栈:是一种只能先进先出的数据结构,通过栈顶和栈底指针控制元素的输入输出。结构体定义:typedef int ElemType;typedef struct Stack { ElemType* top; ElemType* base;}Stack;初始化:先分配内存空间再使栈顶和栈底指向相同,表示空栈void init(Stack& S) { S.top = new ElemType[100]; if (!S.top) return; S.base = S.top;}原创 2021-03-06 09:11:28 · 242 阅读 · 0 评论 -
数据结构--堆排序
堆排序:通过堆的特点,先将头结点(即最大值的节点)与最后一个节点交换,堆大小-1,那么最大值就在最后,之后的操作也不会干扰到他,在把交换上去的节点,进行调整,使堆恢复正常,重复操作。#include<iostream>#include<Windows.h>#define MAX_LENGTH 100using namespace std;typedef struct Heap { int* arr; int size; int max_length;}Heap;原创 2021-03-05 08:49:53 · 74 阅读 · 1 评论 -
数据结构---堆(最大堆)
最大堆特点:原创 2021-03-04 16:22:37 · 498 阅读 · 1 评论 -
数据结构---循环队列
循环队列与普通队列的区别原创 2021-03-03 14:43:56 · 541 阅读 · 2 评论 -
数据结构---链式队列(动态队列)
链式队列:队列的链式存储结构,其实就是线性表的单链表,只是将其限制了只能头删除在尾插入,我们把它简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点链式队列三个重要组成部分:1.链式队列的长度2.指向队首的指针3.指向队尾的指针1.结构类型:定义节点类型,用于存储数据,再定义一个链式队列类型,用于控制整个队列#define MAX 50typedef struct _node { int date; struct _node* next;}Lin.原创 2021-03-03 13:58:38 · 881 阅读 · 0 评论 -
数据结构---队列(数组)
队列:是一种线性表,它只允许先进先出,后进后出。即只能在队首删除元素,在队尾添加元素。队列三个重要组成部分:1.存放队列元素的空间2.队列的队首3.队列的队尾队列的基本操作:1.初始化2.是否为空3.是否满了4.添加元素5.打印元素6.删除元素法一(向前覆盖法)7.删除元素二(向后位移法)1.初始化#define MAX_SIZE 10typedef struct Queue { int queue[MAX_SIZE]; int front; int rear;}Qu原创 2021-03-02 10:21:40 · 348 阅读 · 0 评论 -
Joseph(约瑟夫)问题:循环链表解决
Joseph 问题 :有 10 个小朋友按编号顺序 1,2,。。。,10 顺时针方向围成一圈。从 1 号开 始顺时针方向 1,2,。。。,9 报数,凡报数 9 者出列(显然,第一个出圈为 编号 9 者)。最后一个出圈者的编号是多少?第 5 个出圈者的编号是多少?#include<iostream>#include<Windows.h>#include<stdlib.h>using namespace std;typedef struct LinkNo原创 2020-12-16 11:21:46 · 111 阅读 · 0 评论 -
数据结构---双向链表
双向链表的三个重要组成部分:1.数据域2.前指针域3.后指针域基本操作:1.初始化列表2.前插法3.后插法4.任意位置插入5.删除元素感想:与单链表的区别的就是多了一个前指针.其他的没有太大的变化1.初始化:typedef struct DBLink { int date; struct DBLink* prew; struct DBLink* next;}DBLinkList, DBLinkNode;bool Dbinit_Link(DBLinkList*& L)原创 2020-12-16 10:13:27 · 113 阅读 · 0 评论 -
数据结构---循环链表
循环链表与单链表的最大区别就在于:单链表最后一个节点指向NULL,而循环链表的最后一个节点指向的是头节点至于其他的操作与单链表相似,详细请看<<单链表>>所有的操作几乎都是将判断是否为空,改为是否指向头结点#include<iostream>#include<Windows.h>#include<stdlib.h>using namespace std;typedef struct LinkNode { int date; str原创 2020-12-14 16:31:38 · 62 阅读 · 0 评论 -
数据结构---单链表基本操作
链表的两个重要组成部分:1.数据域2.指针域链表的基本操作:1.初始化链表2.前插法3.后插法4.打印链表5.指定位置插入6.获取指定位置的元素7.根据值查询元素所在的位置8.删除指定位置的元素9.销毁链表自己的感想:链表就是一个由数据和指针组成的一个结构体,数据域里存放数据,指针域中存放指向下一个节点,然后形成一个逻辑上的链条,通过指针就可以遍历所有的数据。1.数据的初始化:将头结点的指针域设置为NULLtypedef struct LinkNode{ int date;原创 2020-12-14 14:19:05 · 392 阅读 · 0 评论 -
顺序表的企业级应用案例
高并发 WEB 服务器中顺序表的应用 高性能的 web 服务器 Squid 每秒可处理上万并发的请求,从网络连接到服务器的客 户端与服务器端在交互时会保持一种会话(和电话通话的场景类似)。服务器端为了管 理好所有的客户端连接,给每个连接都编了一个唯一的整数编号,叫做文件句柄,简称 fd为了防止某些恶意连接消耗系统资源,当某个客户端连接超时(在设定的一定时 间内没有发送数据)时,服务器就需要关闭这些客户端的连接 具体实现方案:当有新的请求连到服务器时,如果经过服务器频率限制模块判断,貌似恶意连 接,则使翻译 2020-12-12 18:20:56 · 97 阅读 · 0 评论 -
浪漫星空优化(顺序表应用)
浪漫星空:浪漫星空的思路:1.定义一个结构体,表示星星的各种属性2.定义一个数组,里面存放100个星星结构体3.运用随机函数进行对每个星星的属性初始化4.显示星星5.移动星星未优化前的代码:(这部分代码是转载的)#include <graphics.h>#include <conio.h>#include <stdlib.h>#include <stdio.h>#include <string>using namesp原创 2020-12-11 16:28:33 · 294 阅读 · 0 评论 -
数据结构----顺序表的基本操作
顺序表三个重要组成部分:1.顺序表的首地址,即存储的首地址2.顺序表的长度3.顺序表的大小顺序表的基本操作:1.建立和初始化2.末尾添加元素3.插入元素4.删除指定位置的元素5.删除指定数据的元素6.销毁顺序表自己的理解:顺序表作为一种最简单的数据结构,类似于数组的升级版。也就是一个动态数组.也随时可以知道他现在有几个元素。1.建立和初始化:这个部分,根据顺序表的基本组成部分可知,应该建立一个结构体,定义一个指定类型的数据的指针,一个长度,一个大小初始化的时候再根据指定的大小,原创 2020-12-09 14:25:29 · 392 阅读 · 0 评论