数据结构

数据结构---快速排序

前提是你 提交于 2020-03-10 13:54:58
1 #include <stdio.h> 2 3 int main(void) 4 { 5 int a[6] = {2,1,0,5,4,3}; 6 int i; 7 QuickSort(a,0,5);//第二个参数表示第一个元素的下标 第三个参数表示最后的元素的下标 8 9 for(i= 0 ;i<6;++i) 10 printf("%d",a[i]); 11 printf("\n"); 12 return 0; 13 } 14 15 void QuickSort(int *a , int low ,int high) 16 { 17 int pos; 18 if(low<high) 19 { 20 pos = FindPos(a,low,high); 21 QuickSort(a,low,pos-1); 22 QuickSort(a,pos+1,high); 23 } 24 } 25 26 int FindPos(int *a , int low , int high) 27 { 28 int val = a[low]; 29 while(low<high) 30 { 31 while(low<high && a[high]>=val ) 32 --high; 33 a[low] = a[high]; 34 while(low<high && a[low]<=val ) 35 +

数据结构与算法系列十一(冒泡排序)

时光总嘲笑我的痴心妄想 提交于 2020-03-10 11:19:02
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 在上一篇: 数据结构与算法系列十(排序概述) 中,我们列举了常用的排序算法

数据结构 - 树、二叉树、完全二叉树、真二叉树、满二叉树

血红的双手。 提交于 2020-03-10 10:13:07
01-树 节点的度:子树的个数。 树的度:所有节点度中的最大值。 叶子节点:度为0的节点。 非叶子节点:度不为0的节点。 层数:根节点在第一层,根节点的子节点在第二层,以此类推 节点的深度:从根节点到当前节点的唯一路径上的节点总数。 节点的高度:从当前节点到最远叶子节点的路径上的节点总数。 树的深度:所有节点深度中的最大值。 树的高度:所有节点高度中的最大值。 树的深度等于树的高度。 有序树:树中任意节点的子节点之间有顺序关系。 02-二叉树及其性质 二叉树: 每个节点的度最大为2(最多拥有2棵子树) 左子树和右子树是有顺序的。 即使某节点只有一棵子树,也要区分左右子树。 非空二叉树的第i层,最多有2^(i-1)个节点(i>=1) 在高度为h的二叉树上最多有2^h-1个节点(h>=1) 对于任何一棵非空二叉树,如果叶子节点个数为n0,度为2的节点个数为n2,则有:n0=n2+1 假设度为1的节点个数为n1,那么二叉树的节点总数 n = n0 + n1 + n2 二叉树的边数 T = n1 + 2*n2 = n-1 = n0 + n1 + n2 -1 03-真二叉树、满二叉树 真二叉树:所有节点的度要么是0,要么是2。 满二叉树:所有节点的度要么是0,要么是2。并且所有叶子节点都在最后一层. 在同样高度的二叉树中,满二叉树的叶子节点数量最多、总节点数量最多。 满二叉树一定是真二叉树

算法 玩转数据结构 1-3 关于课程学习的更多注意事项(王婆卖瓜)

廉价感情. 提交于 2020-03-10 07:55:36
1    作者不同的课程重点比对 2    脚本语言执行注意事项 3    课程代码库 1    作者不同的课程重点比对 1.1  本课程与《算法和数据结构》的对比 a  内容方面 本课程更加关注数据结构的底层实现,包含数据结构更多。 算法与数据结构,包含的数据结构少(标黑部分)。 算法与数据结构课程还包括: 各种排序算法的比较: 选择排序;插入排序;归并排序(自底向上,自顶向下);快速排序(单路,双路,三路); 堆排序;图算法:连通性,寻路,Prim;Kruskal;无向图最短路径;Dijkstra,Bellman-Ford b  使用语言方面 本课程使用java语言,而《算法和数据结构》使用c++讲解。 1.2  本课程与《玩转算法面试》的对比 后者主要讲的算法设计领域相关的问题,后者主要面对面试相关。 2    脚本语言执行注意事项 脚本语言不适用于考察数据结构和性能,因为写出的逻辑的性能不仅仅取决于编写的逻辑,还依赖于脚本的解析器对不同的写法的解析不同。 如:python中,b的写法要优于a的写法,执行效率更高 a: arr=0 for iin range(10): arr. append(i) b: arr=[i for iin range(10)] 3    课程代码库 https://github.com/liuyubobobo/Play-with-Data

【Java数据结构+算法】递归-----八皇后问题(分析与实现)

陌路散爱 提交于 2020-03-10 07:53:52
一、八皇后问题描述 八皇后问题,是一一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出 : 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击, 即:任意两个皇后都不能处于同一行、同一-列或同-斜线上 ,问有多少种摆法。 二、八皇后问题思路分析 (使用到回溯算法) (1)、第一个皇后先放第一行第- -列 (2)、第二个皇后放在第二行第一列、然后判断是否0K,如果不0K, 继续放在第二列、第三列、依次把所有列都放完,找到一个合适的位置 (3)、继续第三个皇后,还是第一列、第二列…直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解。 (4)、当得到一个正确解时,在栈回退到上一一个栈时,就会开始回溯,即将第一个皇后,放到第一-列的所有正确解,全部得到。 (5)、然后回头继续第一个皇后放第二列,后面继续循环执行1,2,3的步骤。 说明:本来应该创建一-个二维数组来表示棋盘,但是实际上可以通过算法,用一个 一维数组 即可解决问题。 比如:arr = {0,4,7,5,2,6,1,3}: ①数组下标+1:表示行的位置 ②数组元素+1:表示列的位置 比如0:第一行第一列 4:第二行第五列 三、代码实现 package com . ycx . recursion ; import java . util . Queue ; public

C数据结构-数组前缀和

走远了吗. 提交于 2020-03-10 03:56:52
leetcode289题,生命游戏。 思路:把数组边界扩充。 leetcode1109题,航班预订统计。 思路:先存前缀,最后去求和。 参考如下作者的算法:https://leetcode-cn.com/problems/corporate-flight-bookings/solution/qian-zhui-he-fa-python-java-shi-jian-fu-za-du-on-b/ int * corpFlightBookings ( int * * bookings , int bookingsSize , int * bookingsColSize , int n , int * returnSize ) { * returnSize = n ; int * ret = ( int * ) malloc ( sizeof ( int ) * n ) ; int i , j ; memset ( ret , 0 , sizeof ( int ) * n ) ; for ( i = 0 ; i < bookingsSize ; i ++ ) { ret [ bookings [ i ] [ 0 ] - 1 ] + = bookings [ i ] [ 2 ] ; if ( bookings [ i ] [ 1 ] < n ) { ret [ bookings [ i ]

Linux-proc文件系统介绍

时光怂恿深爱的人放手 提交于 2020-03-10 03:24:03
1、操作系统级别的调试 (1)、简单程序单步调试 (2)、复杂程序printf打印信息调试 (3)、框架体系日志记录信息调试 (4)、内核调试的困境 2、proc虚拟文件系统的工作原理 (1)、Linux内核是一个非常庞大、复杂的一个单独的程序,对于这样的一个程序来说,调试是非常的复杂的。 (2)、像kernel这样庞大的项目,给里边添加/更改一个功能是非常麻烦的,因为你这个添加的新功能可能会影响其他已经有的功能。 (3)、早期内核版本中尽管调试很麻烦,但是高手们还可以凭借自己超凡脱俗的能力去驾驭。但是到了2.4左右的版本的时候,这个难度就非常大了。 (4)、为了降低内核调试和学习的难度,内核开发者们在内核中添加了一些属性专门用于调试内核,proc文件系统就是一个尝试。 (5)、proc文件系统的思路就是:在内核中构建一个虚拟文件系统/proc,内核运行时将内核中一些关键的数据结构以文件的方式呈现在/proc目录中的一些特定文件中,这样相当于将不可见的内核中的数据结构以可视化的方式呈现给内核的开发者。 (6)、proc文件系统给了开发者一种调试内核的方法:我们通过实时的观察/proc/xxx文件,来观看内核中特定数据结构的值,在我们添加一个新功能的前后来对比,就可以知道这个新功能产生的影响对不对了。 (7)、proc目录下的文件大小都是0,因为这些文件本身并不存在于硬盘中

算法与数据结构实验题6.4 order (二叉树)

喜夏-厌秋 提交于 2020-03-09 20:28:26
1、题目: 2、代码: #include<iostream> #include<algorithm> using namespace std; struct Node { int left; int right; int father; int ord; } node[100010]; void preOrder(int m) { if(m!=-1) { cout<<m<<" "; preOrder(node[m].left); preOrder(node[m].right); } } void posOrder(int m) { if(m!=-1) { posOrder(node[m].left); posOrder(node[m].right); cout<<m<<" "; } } int main() { int n; cin>>n; int i; for(i=1; i<=n; i++) { cin>>node[i].father; } for(i=1; i<=n; i++) { int x; cin>>x; node[x].ord=i; } for(i=1; i<=n; i++) { node[i].left=-1; node[i].right=-1; } //为每个结点设置儿子 for(i=1; i<=n; i++) { if(node[node[i].father]

设计模式之访问者模式

大兔子大兔子 提交于 2020-03-09 16:52:51
访问者模式 1.简单介绍 访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,可以在不改变结构的前提下定义新的操作(作用于这些元素) 访问者模式主要是将数据结构和数据的操作进行分离,解决了 数据结构 和 操作耦合性 的问题 访问者模式的基本工作原理是: 在被访问的类里提供一个对外接待访问者的方法 void accept(Visitor visitor) 2.访问者中的角色 Visitor 抽象访问者,为该对象结构中的ConcreteElement的每一个类声明一个访问操作 ConcreteVisitor 具体的访问者,实现每个有Visitor声明的操作 Element : 定义了一个accept操作,可以接受访问者对象 ConcreteElement : 具体的待访问类,实现accept方法(内部聚合访问者) ObjectStructure 访问元素的集合(多个Element),便于统一规划 3.访问者模式的结构图 4.实现简单的访问者模式代码 import com . liz . GOF23 . visitor . relearn . visitor . Visitor ; //!!!被访问类的接口 //抽象元素(内部有accept方法用于接收访问者) public interface Element { void accept (