《大话数据结构(C实现)》
《大话数据结构(C实现)》 |
版本 |
作者 |
参与者 |
完成日期 |
备注 |
YanlzStruct_CBase_V01_1.0 |
严立钻 |
|
2020.02.09 |
|
|
|
|
|
|
##《大话数据结构(C实现)》发布说明:
++++“大话数据结构(C实现)”:是对“软件架构设计”的综合探索;【程序=数据结构+算法】:数据结构是程序设计的重要技术;数据结构在某种程度上和设计模式类似,都是前辈的武功套路,不同的是,设计模式是近几十年的卓越程序员的智慧结晶,而数据结构是几百上千年的无数科学家、数学家的智慧沉淀,更具有深厚的背景;数据结构是相互之间存在一种或多种特定关系的数据元素的集合;数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科;
++++“大话数据结构(C实现)”:定位在一个科普类知识,了解“数据结构”以及相关算法研究,以及软件架构设计和框架编程!
@@提示:有些博客可能只是开了头,如果感兴趣的同学,可以“点赞”或“评论区留言”,只要关注的同学多了,那就会继续完善哟!(“++==”,表示没有写完的,如果关注度不高就不完善了;“++ok++”,表示此篇博客已经完成,是阶段性完整的!)
$$$$博客溯源:
++++VR云游戏=Unity+SteamVR+云技术+5G+AI;(说明:AI人工智能不是我们的主要研究技术,只是了解一下,领略一下有风的感觉!但是,VR是我们的研究重点)
++++【软件架构设计】分类:https://blog.csdn.net/vrunsoftyanlz/category_9708791.html
++++【大话数据结构(C实现)】:https://blog.csdn.net/VRunSoftYanlz/article/details/104242455
++++【大话数据结构(C#实现)】:https://blog.csdn.net/VRunSoftYanlz/article/details/104243017
##《大话数据结构(C实现)》目录
#第一篇:数据结构基础篇
#第二篇:进阶算法篇
#第三篇:数据结构剖析篇
#第四篇:数据结构拓展篇
#第五篇:立钻哥哥带您数据结构实战
#第一篇:数据结构基础篇
#第一篇:数据结构基础篇 |
#第一篇:数据结构基础篇
++++立钻哥哥:数据结构是相互之间存在一种或多种特定关系的数据元素的集合;数据结构是计算机存储、组织数据的方式;通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率;数据结构往往同高效的检索算法和索引技术有关;
++++数据结构(Data Structure)是带有结构特性的数据元素的集合,它研究的数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型;
++++数据结构的研究内容是构造复杂软件系统的基础,它的核心技术是分解与抽象;通过分解可以划分出数据的3个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构;
++数据的逻辑结构
++++立钻哥哥:数据的逻辑结构指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后间关系,而与他们在计算机中的存储位置无关;逻辑结构包括:集合、线性结构、树形结构、图形结构;
++++[集合]:数据结构中的元素之间除了“同属一个集合”的相互关系外,别无其他关系;
++++[线性结构]:数据结构中的元素存在一对一的相互关系;
++++[树形结构]:数据结构中的元素存在一对多的相互关系;
++++[图形结构]:数据结构中的元素存在多对多的相互关系;
++常用的数据结构
++++立钻哥哥:在计算机科学的发展过程中,数据结构也随之发展;程序设计中常用的数据结构包括:数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)等;
++++[数组(Array)]:数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合;数组可以说是最基本的数据结构,在各种编程语言中都有对应;一个数组可以分解为多个数组元素,按照数据元素的类型,数组可以分为整型数组、字符型数组、浮点型数组、指针数组和结构数组等;数组还可以有一维、二维以及多维等表现形式;
++++[栈(Stack)]:栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作;栈按照后进先出的原则来存储数据,也就是说,先插入的数据将被压入栈底,最后插入的数据在栈顶,读出数据时,从栈顶开始逐个读出;栈在汇编语言程序中,经常用于重要数据的现场保护;栈中没有数据时,称为空栈;
++++[队列(Queue)]:队列和栈类似,也是一种特殊的线性表;和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作;一般来说,进行插入操作的一端称为队尾,进行删除操作的一端称为队头;队列中没有元素时,称为空队列;
++++[链表(Linked List)]:链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点;链表由一系列数据结点构成,每个数据结点包括数据域和指针域两部分;其中,指针域保存了数据结构中下一个元素存放的地址;链表结构中数据元素的逻辑顺序时通过链表中的指针链接次序来实现的;
++++[树(Tree)]:树是典型的非线性结构,它是包括,2个结点的有穷集合K;在树结构中,有且仅有一个根结点,该结点没有前驱结点;在树结构中的其他结点都有且仅有一个前驱结点,而且可以有两个后继结点,m>=0;
++++[图(Graph)]:图是另一种非线性数据结构;在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对;如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系;
++++[堆(Heap)]:堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆;堆的特点是根结点的值是所有结点中最小的或者最大的,并且根结点的两个子树也是一个堆结构;
++++[散列表(Hash)]:散列表源自于散列函数(Hash Function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记录;
#第二篇:进阶算法篇
#第二篇:进阶算法篇 |
#第二篇:进阶算法篇
++++立钻哥哥:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制;一个算法的优劣可以用空间复杂度与时间复杂度来衡量;算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态;一个状态到另一个状态的转移不一定是确定的;随机化算法在内的一些算法,包含了一些随机输入;
++++一个算法应该具有5个重要特征:有穷性、确切性、输入项、输出项、可行性等;
++++[有穷性(Finiteness)]:算法的有穷性是指算法必须能在执行有限个步骤之后终止;
++++[确切性(Definiteness)]:算法的每一步骤必须有确切的定义;
++++[输入项(Input)]:一个算法由0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
++++[输出项(Output)]:一个算法有一个或多个输出,以反映对输入数据加工后的结果;没有输出的算法是毫无意义的;
++++[可行性(Effectiveness)]:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性);
++算法
++++立钻哥哥:算法(Algorithm)是程序设计的灵魂,它是用系统的方法描述解决问题的策略机制;一个正确的算法满足的性质:输入、输出、确定性、有限性等;
++++[输入]:有零个或多个输入;
++++[输出]:至少有一个输出;
++++[确定性]:组成算法的每条指令清晰,无歧义;
++++[有限性]:一个算法在执行有限步骤后必须结束,即计算步骤是有限的;
++++描述算法可以由多种方式,如自然语言、流程图、伪代码、程序设计语言;算法设计就是针对具体的问题,设计出良好的算法,使计算机能够解决该问题;同一个问题可以采用不同的算法实现,不同的算法可能时间、空间并不相同,一个算法的优劣可以用空间复杂度与时间复杂度来衡量;
++++算法设计中经常采用的排序算法、查找算法、迭代算法、递推算法、递归算法、枚举算法、贪心算法、回溯算法、矩阵算法等;
++数据
++++立钻哥哥:数据是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合;数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型;
++数据元素
++++立钻哥哥:数据元素是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理;也被称为记录;
++数据项
++++立钻哥哥:一个数据元素可以由若干个数据项组成;数据项是数据不可分割的最小单位;
++数据对象
++++立钻哥哥:数据对象是性质相同的数据元素的集合,是数据的子集;
++数据结构
++++立钻哥哥:数据结构是相互之间存在一种或多种特定关系的数据元素的集合;不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构;
++逻辑结构
++++立钻哥哥:逻辑结构是指数据对象中数据元素之间的相互关系;逻辑结构分为:集合结构、线性结构、树形结构、图形结构等;
++物理结构
++++立钻哥哥:物理结构是指数据的逻辑结构在计算机中的存储形式;数据元素的存储结构形式有:顺序存储、链式存储等;
++++[顺序存储结构]:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的;
++++[链式存储结构]:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的;
++数据类型
++++立钻哥哥:数据类型是指一组性质相同的值的集合及定义在此集合上的一些操作的总称;
++抽象数据类型
++++立钻哥哥:抽象数据类型(Abstract Data Type, ADT)是指一个数学模型及定义在该模型上的一组操作;抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性;
++++[抽象]:是指抽取出事物具有的普遍性的本质;“抽象”的意义在于数据类型的数学抽象特性;
++算法(Algorithm)
++++立钻哥哥:算法(Algorithm)是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作;
++++算法具有五个基本特性:输入、输出、有穷性、确定性、可行性等;
++++[输入输出]:算法具有零个或多个输入;算法至少有一个或多个输出;
++++[有穷性]:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成;
++++[确定性]:算法的每一步骤都具有确定的含义,不会出现二义性;
++++[可行性]:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成;
++算法设计的要求
++++立钻哥哥:好的算法应该具有:正确性、可读性、健壮性、高效率和低存储量的特征;
++++[正确性]:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案;
++++[可读性]:算法设计的另一目的是为了便于阅读、理解和交流;
++++[健壮性]:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果;
++++[时间效率高和存储量低]:设计算法应该尽量满足时间效率高和存储量低的需求;
++算法时间复杂度
++++立钻哥哥:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级;算法的时间复杂度,也就是算法的时间量度,记住:T(n)=O(f(n));它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度;其中f(n)是问题规模n的某个函数;
++推导大O阶:++++1、用常数1取代运行时间中的所有加法常数;++++2、在修改后的运行次数函数中,只保留最高阶项;++++3、如果最高阶项存在且不是1,则去除与这个项相乘的常数;得到的结果就是大O阶;
|
++常用的时间复杂度所耗费的时间从小到大依次如下:++++O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n);
|
++++[O(1)]:常数阶;
++++[O(n)]:线性阶;
++++[O(n^2)]:平方阶;
++++[O(logn)]:对数阶;
&&Tips:对算法的学习,立钻哥哥已经整理出几篇独立博文了,有兴趣的可以查阅以下链接:
++++【C/C++函数与算法】:https://blog.csdn.net/VRunSoftYanlz/article/details/104062527
++++【Unity小游戏算法分析】:https://blog.csdn.net/VRunSoftYanlz/article/details/87908365
++++【设计模式(精华篇)】:https://blog.csdn.net/VRunSoftYanlz/article/details/81322678
++++【软件架构设计】分类:https://blog.csdn.net/vrunsoftyanlz/category_9708791.html
++++【C++C铸就生存利器】分类:https://blog.csdn.net/vrunsoftyanlz/category_9325802.html
++++【人工智能AI2026】分类:https://blog.csdn.net/vrunsoftyanlz/category_9212024.html
++++【立钻哥哥CSDN空间】:https://blog.csdn.net/VRunSoftYanlz/
#第三篇:数据结构剖析篇
#第三篇:数据结构剖析篇 |
#第三篇:数据结构剖析篇
++++立钻哥哥:数据的逻辑结构指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后间关系,而与他们在计算机中的存储位置无关;逻辑结构包括:集合、线性结构、树形结构、图形结构等;
++++C1、基础篇
++++C2、进阶算法篇
++++C3、线性表
++++C4、栈与队列
++++C5、串
++++C6、树
++++C7、图
++C1、基础篇
++C1、基础篇 |
++C1、基础篇
++++立钻哥哥:在计算机科学的发展过程中,数据结构也随之发展;程序设计中常用的数据结构包括:数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)等;
++C2、进阶算法篇
++C2、进阶算法篇 |
++C2、进阶算法篇
++++立钻哥哥:算法(Algorithm)是程序设计的灵魂,它是用系统的方法描述解决问题的策略机制;一个正确的算法满足的性质:输入、输出、确定性、有限性等;
++++[输入]:有零个或多个输入;
++++[输出]:至少有一个输出;
++++[确定性]:组成算法的每条指令清晰,无歧义;
++++[有限性]:一个算法在执行有限步骤后必须结束,即计算步骤是有限的;
++++描述算法可以由多种方式,如自然语言、流程图、伪代码、程序设计语言;算法设计就是针对具体的问题,设计出良好的算法,使计算机能够解决该问题;同一个问题可以采用不同的算法实现,不同的算法可能时间、空间并不相同,一个算法的优劣可以用空间复杂度与时间复杂度来衡量;
++++算法设计中经常采用的排序算法、查找算法、迭代算法、递推算法、递归算法、枚举算法、贪心算法、回溯算法、矩阵算法等;
++排序算法
++排序算法 |
++排序算法
++++立钻哥哥:排序算法是程序设计中最为常用的算法;常用的排序算法包括:插入类排序算法、交换类排序算法、选择类排序算法、归并排序算法和基数排序算法等;
++插入排序
++++立钻哥哥:插入排序的算法思想:将待排序元素分为已排序子集和未排序子集,依次从未排序子集中的一个元素插入到已排序子集中,使已排序子集仍然有序;重复执行以上过程,直到所有元素都有序为止;
++++直接插入排序
++++直接插入排序 |
++直接插入排序
++++立钻哥哥:直接插入排序是一种最简单的插入排序算法;直接插入算法实现简单,适用于待排序元素较少且基本有序的情况;在元素基本有序时,需要比较的次数和移动的次数很少,因此在这种情况下使用直接插入排序最佳;
++++[稳定性与复杂度]:直接插入排序属于稳定的排序方法,直接插入排序算法的时间复杂度为O(n.2),空间复杂度为O(1);
//立钻哥哥:直接插入排序算法 #include <stdio.h>
void PrintMyArray(int a[], int n);
void main(){ int a[] = { 27, 44, 18, 77, 23, 89, 100}; int t, i, j, n;
n = sizeof(a)/sizeof(a[0]);
for(i=1; i<n; i++){ t = a[i]; for(j=i-1; j>=0&&t<a[j]; j--){ a[j+1] = a[j]; } a[j+1] = t;
PrintMyArray(a, n); } }
void PrintMyArray(int a[], int n) { ... ... } |
++++折半插入排序
++++折半插入排序 |
++折半插入排序
++++立钻哥哥:折半插入排序算法是直接插入排序的改进;它的主要改进在于,在已经有序的集合中使用折半查找法确定带排序元素的插入位置;在找到要插入的位置后,将待排序元素插入到相应的位置;
++++[折半插入排序与直接插入排序的区别]:直接插入排序,从右到左按顺序查找插入的位置;折半插入排序,折半查找算法在有序集合中查找插入的位置;
++++[主要用途]:折半插入排序算法也直接插入排序一样,通常也用于待排序元素的个数较少的情况;如果待排序算法基本有序,则最好采用直接插入排序算法;
++++[稳定性与复杂度]:折半插入排序也是一种稳定的排序算法;虽然折半插入排序在查找插入的位置时改进了查找方法,减少了比较次数,比较次数由O(n)变为O(nlog2n);但是移动元素的时间复杂度仍然没有改变,因此折半查找排序算法的整体时间复杂度仍然为O(n^2),它的空间复杂度为O(1);
//立钻哥哥:折半插入排序算法 #include <stdio.h>
void PrintMyArray(int a[], int n);
void main(){ int a[] = { 56, 77, 81, 98, 28, 53, 11 }; int t, i, j, low, high, mid, n;
n = sizeof(a)/sizeof(a[0]); for(i=1; i<n; i++){ t = a[i]; for(low=0, high=i-1; high>=low; ){ mid = (low+high)/2; if(t < a[mid]){ high = mid-1; }else{ low = mid+1; } }
for(j=i-1; j>=low; j--){ a[j+1] = a[j]; }
a[low] = t; PrintMyArray(a, n); } }
void PrintMyArray(int a[], int n){ ... ... } |
++++希尔排序
++++希尔排序 |
++希尔排序
++++立钻哥哥:希尔排序也属于插入类排序算法;希尔排序通过缩小增量,将待排序元素划分为若干个子序列,分别对各个子序列按照直接插入排序算法进行排序;当增量为1时,待排序元素构成一个子序列,对该序列排序完毕后希尔排序算法结束;
++++[与直接插入排序、折半插入排序的区别]:直接插入排序、折半插入排序;待排序元素构成一个子序列;希尔排序:待排序元素划分为若干个子序列,需要分别对每个子序列进行排序;
++++[主要用途]:希尔排序算法可以使值较小的元素很快向前移动,当待排序元素基本有序时,再使用直接插入排序处理,时间效率会高很多;希尔排序主要用在数据量在5000以下且速度要求并不是很重要的场合;
++++[稳定性和复杂度]:希尔排序是一种不稳定的排序算法;由于增量的选择是随机的,因此分析希尔排序算法的时间复杂度就变成一件非常复杂的事情;但是经过研究发现,当增量序列delta[k]=2^(t-k+1)时,希尔排序的时间复杂度为O(n^(3/2));希尔排序的空间复杂度为O(1);
//立钻哥哥:希尔排序算法 #include <stdio.h>
void MyShellSort(int a[], int length, int delta[], int m); void MyShellInsert(int a[], int length, int c); void MyDispArray(int a[], int length);
void main(){ int a[] = { 43, 56, 78, 92, 43, 21, 31 }; int delta[] = { 4, 2, 1 }, m=3, length=sizeof(a)/sizeof(a[0]);
MyShellSort(a, length, delta, m);
MyDispArray(a, length); }
//对数组中的元素进行一趟希尔排序,c是增量 void MyShellInsert(int a[], int length, int c){ int i, j, t;
//将距离为c的元素作为一个子序列进行排序 for(i=c; i<length; i++){ //如果后者小于前者,则需要移动元素 if(a[i] < a[i-c]){ t = a[i]; for(j = i-c; j>=0 && t<a[j]; j=j-c){ a[j+c] = a[j]; }
//依次将元素插入到正确的位置 a[j+c] = t; } } }
//希尔排序,每次调用算法ShellInsert,delta是存放增量的数组 void MyShellSort(int a[], int length, int delta[], int m){ int i;
//进行m次希尔插入排序 for(i=0; i<m; i++){ MyShellInsert(a, length, delta[i]); MyDispArray(a, length); } }
//输出数组a中的元素 void MyDispArray(int a[], int length){ } |
++交换排序
++交换排序 |
++交换排序
++++立钻哥哥:交换排序的算法思想:通过交换逆序的元素实现交换排序;交换排序主要有两种:冒泡排序和快速排序;
++++冒泡排序
++++冒泡排序 |
++冒泡排序
++++立钻哥哥:冒泡排序是一种简单的交换类排序算法,它是通过交换相邻的两个数据元素,逐步将待排序序列变成有序序列;它的基本算法思想描述:假设待排序元素有n个,从第1个元素开始,依次交换相邻的两个逆序元素,直到最后一个元素为止;当第1趟排序结束,机会将最大的元素移动到序列的末尾;然后按照以上方法进行第2趟排序,次大的元素将会被移动到序列的倒数第2个位置;依次类推,经过n-1趟排序后,整个元素序列就成了有序的序列;每趟排序过程中,值小的元素向前移动,值大的元素向后移动,就像气泡一样向上升,因此将这种排序方法称为冒泡排序;
++++[主要用途]:冒泡算法实现简单,适用于待排序元素较少且对时间要求不高的场合;
++++[稳定性与复杂度]:冒泡排序是一种稳定的排序方法;假设待排序元素为n个,则需要进行n-1趟排序,每趟排序需要进行n-i次比较,其中i=1,2,...,n-1;因此,冒泡排序的比较次数为E(...)=(n(n-1))/2,移动元素的次数为(3n(n-1)/2),它的时间复杂度为O(n^2),空间复杂度为O(1);
//立钻哥哥:冒泡排序算法 #include <stdio.h>
void MyPrintArray(int a[], int n);
void main(){ int a[] = { 45, 78, 92, 44, 52, 67, 98, 12 }; int i, j, t, n=sizeof(a)/sizeof(a[0]);
for(i=1; i<n; i++){ for(j=0; j<n-i; j++){ if(a[j] > a[j+1]){ t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } MyPrintArray(a, n); } }
void MyPrintArray(int a[], int n){ ... ... } |
++++快速排序
++++快速排序 |
++快速排序
++++立钻哥哥:快速排序是冒泡排序算法的改进,也属于交换类排序算法;快速排序正是将每个部分都以枢轴元素为中心不断地划分元素序列,直到每个序列中的元素只有一个,不能继续划分为止;
++++快速排序算法可以通过递归调用实现,排序的过程其实就是不断地对元素序列进行划分,直到每一个部分不能划分时即完成快速排序;
++++[主要用途]:快速算法是冒泡排序算法的改进,实现比较算法,它主要用在需要对大量数据进行排序的情况,它的时间效率要远高于冒泡排序,在数据量特别大的情况下特别明显;
++++[稳定性与复杂度]:快速排序是一种不稳定的排序算法;在最好的情况下,每趟排序都是将元素序列正好划分为两个等长的子序列;这样,快速排序子序列的划分过程就是创建完全二叉树的过程,划分的次数等于树的深度即log2n,因此,最好的情况下,时间复杂度为O(n^2);在最坏的情况下,待排序元素序列已经是有序的,则时间的花费主要集中在元素的比较次数上;每一趟需要比较n-1次,第二趟需要比较n-2次,依次类推,共需要比较n(n-1)/2次,因此时间复杂度为O(n^2);在平均情况下,快速排序的时间复杂度为O(nlog2n);快速排序的空间复杂度为O(log2n);
//立钻哥哥:快速排序算法 #include <stdio.h>
void MyDispArray(int a[], int n); void MyDispArray2(int a[], int n, int pivot, int count); void MyQSort(int a[], int n, int low, int high); void MyQuickSort(int a[], int n); void MyPartition(int a[], int low, int high);
//利用快速排序算法对数组a中的元素排序 void MyQSort(int a[], int n, int low, int high){ int pivot; static count = 1;
//如果元素序列的长度大于1 if(low < high){ //将待排序序列a[low,high]划分为两部分 pivot = MyPartition(a, low, high); count++;
//对左边的子表进行递归排序,pivot是枢轴位置 MyQSort(a, n, low, pivot-1);
//对右边的子表进行递归排序 MyQSort(a, n, pivot+1, high); } }
//对数组a进行快速排序 void MyQuickSort(int a[], int n){ MyQSort(a, n, 0, n-1); }
//对数组a[low, high]的元素进行一趟排序,使枢轴前面的元素小于枢轴元素,枢轴后面的元素大于等于枢轴元素,并返回枢轴位置 int MyPartition(int a[], int low, int high){ int t, pivot;
//将表的第一个元素作为枢轴元素 pivot = a[low]; t = a[low];
//立钻哥哥:从表的两端交替地向中间扫描 while(low < high){ //从表的末端向前扫描 while(low<high && a[high]>=pivot){ high--; }
//将当前high指向的元素保存在low位置 if(low < high){ a[low] = a[high]; low++; }
//从表的始端向后扫描 while(){ low++; }
//将当前low指向的元素保存在high位置 if(low < high){ a[high] = a[low]; high--; }
//将枢轴元素保存在low的位置 a[low] = t; }
//返回枢轴所在位置 return low; }
void MyDispArray2(int a[], int n, int pivot, int count){ ... ... }
void MyDispArray(int a[], int n){ ... ... }
void main(){ int a[] = { 33, 66, 77, 88, 43, 23, 14, 58 }; int n = sizeof(a)/sizeof(a[0]); MyDispArray(a, n);
MyQuickSort(a, n); MyDispArray(a, n); } ++++立钻哥哥:快速算法是冒泡排序算法的改进,实现比较复杂,它主要用在需要对大量数据进行排序的情况,它的时间效率要远高于冒泡排序,在数据量特别大的情况下特别明显; |
++选择排序
++选择排序 |
++选择排序
++++立钻哥哥:选择排序的算法思想:从待排序的元素序列中选择最小(最大)的元素,将其放在已排序元素序列的最前(最末),其余的元素构成新的待排序元素序列,然后从待排序元素序列中选择最小(最大)的元素,将其放在已排序元素序列的最前(最末);依次类推,直到待排序元素序列中没有待排序的元素;选择排序主要有两种:简单选择排序和堆排序;
++++简单选择排序
++++简单选择排序 |
++简单选择排序
++++立钻哥哥:简单选择排序是一种简单的选择类排序算法,它是通过依次找到待排序元素序列中最小的数据元素,并将其放在序列的最前面,从而使待排序元素序列变为有序序列;它的基本算法思想描述:假设待排序的元素序列有n个,在第一趟排序过程中,从n个元素序列中选择最小的元素,并将其放在元素序列的最前面即第一个位置;在第二趟排序过程中,从剩余的n-1个元素中,选择最小的元素,将其放在第二个位置;依次类推,直到没有待比较的元素,简单选择排序算法结束;
++++[主要用途]:简单选择排序算法实现简单,适用于待排序元素较少且对时间要求不高的场合;
++++[稳定性与复杂度]:简单选择是一种不稳定的排序算法;在最好的情况下,待排序元素序列按照非递减排列,则不需要移动元素;在最坏的情况下,待排序元素按照非递增排列,则在每一趟排序都需要移动元素,移动元素的次数为3(n-1);在任何情况下,简单选择排序算法都需要进行n(n-1)/2次的比较;简单选择排序算法的时间复杂度是O(n^2);简单选择排序的空间复杂度是O(1);
//立钻哥哥:简单选择排序算法 #include <stdio.h>
void MySelectSort(int a[], int n); void MyDispArray(int a[], int n);
void main(){ int a[] = { 34, 56, 78, 92, 35, 68, 12 }; int n = sizeof(a)/sizeof(a[0]);
MySelectSort(a, n); MyDispArray(a, n); }
//简单选择排序 void MySelectSort(int a[], int n){ int i, j, k, t;
//将第i个元素与第i+1...n个元素比较,将最小的元素放在第i个位置 for(i=0; i<n-1; i++){ j = i;
//最小的元素的序号为j for(k=i+1; k<n; k++){ if(a[k] < a[j]){ j = k; }
//如果序号i不等于j,则需要将序号i和序号j的元素交换 if(j != i){ t = a[i]; a[i] = a[j]; a[j] = t; }
MyDispArray(a, n); } } }
//输出数组中的元素 void MyDispArray(int a[], int n){ ... ... } |
++C3、线性表
++C3、线性表 |
++C3、线性表
++++立钻哥哥:线性表(List)是零个或多个数据元素的有序序列;线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表;在较复杂的线性表中,一个数据元素可以由若干个数据项组成;
++++C3.1、顺序存储结构
++++C3.2、链式存储结构
++C3.1、顺序存储结构
++C3.1、顺序存储结构 |
++C3.1、顺序存储结构
++++立钻哥哥:线性表(List)的数据对象集合为{ a1, a2, ... ..., an},每个元素的类型均为DataType;其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素;数据元素之间的关系是一对一的关系;
++++顺序存储结构的优点:无须为表示表中元素之间的逻辑关系而增加额外的存储空间;可以快速地存取表中任一位置的元素;
++++顺序存储结构的缺点:插入和删除操作需要移动大量元素;当线性表长度变化较大时,难以确定存储空间的容量;造成存储空间的“碎片”;
++++[InitList(*L)]:初始化操作,建立一个空的线性表L;
++++[ListEmpty(L)]:若线性表为空,返回true,否则返回false;
++++[ClearList(*L)]:将线性表清空;
++++[GetElem(L, i, *e)]:将线性表L中的第i个位置元素值返回给e;
++++[LocateElem(L, e)]:在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败;
++++[ListInsert(*L, i, e)]:在线性表L中的第i个位置插入新元素e;
++++[ListDelete(*L, i, *e)]:删除线性表L中第i个位置元素,并用e返回其值;
++++[ListLength(L)]:返回线性表L的元素个数;
//立钻哥哥:将所有的在线性表Lb中但不在La中的数据元素插入到La中 void MyUnionL(List *La, List Lb){ int len_La, len_Lb, i; ElemType e;
len_La = ListLength(*La); //求线性表的长度 len_Lb = ListLength(Lb);
for(i=1; i<=len_Lb; i++){ GetElem(Lb, i, &e); //取Lb中第i个数据元素赋给e
//La中不存在和e相同数据元素 if(!LocateElem(*Le, e)){ ListInsert(La, ++len_La, e); //插入 } } } |
++顺序存储结构
++++立钻哥哥:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素;
++++线性表的每个数据元素的类型都相同,可以用C语言的一维数组来实践顺序存储结构;
#define MAXSIZE 20 //存储空间初始分配量 typedef int ElemType; //根据实际情况而定,这里假设为int
typedef struct{ ElemType data[MAXSIZE]; //数组存储数据元素,最大值为MAXSIZE int length; //线性表当前长度 }SqlList; |
++++存储器中的每个存储单元都有自己的编号,这个编号称为地址;
++GetElem()获得元素操作
++++立钻哥哥:对于线性表的顺序存储结构来说,如果我们要实现GetElem操作,即将线性表L中的第i个位置元素值返回,其实是非常简单的;就程序而言,只要i的数值在数组下标范围内,就是把数组第i-1下标的值返回即可;
#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0
typedef int Status;
//Status是函数的类型,其值是函数结果状态代码,如OK等 //初始条件:顺序线性表L已存在,1<=i<=ListLength(L); //操作结果:用e返回L中第i个数据元素的值 Status GetElem(SqList L, int i, ElemType *e){ if(L.length ==0 || i < 1 || i > L.length){ return ERROR; }
*e = L.data[i - 1];
return OK; } ++++立钻哥哥:返回值类型Status是一个整型,返回OK代表1,ERROR代表0; |
++ListInsert()插入操作
++++立钻哥哥:ListInsert(*L, i, e)在线性表L中的第i个位置插入新元素e;插入算法的思路:如果插入位置不合适,抛出异常;如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;将要插入元素填入位置i处;表长加1;
//初始条件:顺序线性表L已存在,1<=i<=ListLength(L) //操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 Status ListInsert(SqList *L, int i, ElemType e){ int k;
//顺序线性表已经满 if(L->length == MAXSIZE){ return ERROR; }
//当i不再范围内时 if(i<1 || i>L->length + 1){ return ERROR; }
//若插入数据位置不在表尾 if(i <= L->length){ //将要插入位置后数据元素向后移动一位 for(k=L->length - 1; k >= i-1; k--){ L->data[k+1] = L->data[k]; } }
L->data[i-1] = e; //将新元素插入 L->length++;
return OK; } |
++ListDelete()删除操作
++++立钻哥哥:删除算法的思路:如果删除位置不合理,抛出异常;取出删除元素;从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;表长减1;
//初始条件:顺序线性表L已存在,1<=i<=ListLength(L) //操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 Status ListDelete(SqList *L, int i, ElemType *e){ int k;
//线性表为空 if(L->length == 0){ return ERROR; }
//删除位置不正确 if(i<1 || i>L->length){ return ERROR; }
*e = L->data[i-1];
//如果删除不是最后位置 if(i < L->length){ //将删除位置后继元素前移 for(k=i; k < L->length; k++){ L->data[k-1] = L->data[k]; } }
L->length--;
return OK; } |
++C3.2、链式存储结构
++C3.2、链式存储结构 |
@@提示:有些博客可能只是开了头,如果感兴趣的同学,可以“点赞”或“评论区留言”,只要关注的同学多了,那就会继续完善哟!(“++==”,表示没有写完的,如果关注度不高就不完善了;“++ok++”,表示此篇博客已经完成,是阶段性完整的!)
++++VR云游戏=Unity+SteamVR+云技术+5G+AI;(说明:AI人工智能不是我们的主要研究技术,只是了解一下,领略一下有风的感觉!但是,VR是我们的研究重点)
++++【软件架构设计】分类:https://blog.csdn.net/vrunsoftyanlz/category_9708791.html
++++【大话数据结构(C实现)】:https://blog.csdn.net/VRunSoftYanlz/article/details/104242455
++++【大话数据结构(C#实现)】:https://blog.csdn.net/VRunSoftYanlz/article/details/104243017
++++【游戏框架】:https://blog.csdn.net/VRunSoftYanlz/article/details/80630325
++++【C/C++函数与算法】:https://blog.csdn.net/VRunSoftYanlz/article/details/104026090
++++【设计模式简单整理】:https://blog.csdn.net/VRunSoftYanlz/article/details/79839641
++++【设计模式(精华篇)】:https://blog.csdn.net/VRunSoftYanlz/article/details/81322678
++++【C++从入门到放弃】:https://blog.csdn.net/VRunSoftYanlz/article/details/103849127
++++【Linux从入门到放弃】:https://blog.csdn.net/VRunSoftYanlz/article/details/104176967
++++【Python从入门到放弃】:https://blog.csdn.net/VRunSoftYanlz/article/details/101393069
++++【XLua教程】:https://blog.csdn.net/VRunSoftYanlz/article/details/81141502
++++【Unity Shader教程】:https://blog.csdn.net/VRunSoftYanlz/article/details/80372628
++++【SteamVR2.2.0快速入门】:https://blog.csdn.net/VRunSoftYanlz/article/details/88833579
++++【SteamVR实战之PMCore】:https://blog.csdn.net/VRunSoftYanlz/article/details/89463658
++++【Unity企业内训】:https://blog.csdn.net/VRunSoftYanlz/article/details/82634668
++++【Cocos2dx面试题】:https://blog.csdn.net/VRunSoftYanlz/article/details/78630967
++++【Unity面试题】:https://blog.csdn.net/VRunSoftYanlz/article/details/78630687
++++【C++C铸就生存利器】分类:https://blog.csdn.net/vrunsoftyanlz/category_9325802.html
++++【人工智能AI2026】分类:https://blog.csdn.net/vrunsoftyanlz/category_9212024.html
++++【立钻哥哥CSDN空间】:https://blog.csdn.net/VRunSoftYanlz/
【XR游戏开发QQ群:784477094】
++立钻哥哥推荐的拓展学习链接(Link_Url):
立钻哥哥推荐的拓展学习链接(Link_Url) |
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
++++虚拟现实VR资讯: https://blog.csdn.net/VRunSoftYanlz/article/details/89165846
++++HTC_VIVE开发基础:https://blog.csdn.net/VRunSoftYanlz/article/details/81989970
++++Oculus杂谈:https://blog.csdn.net/VRunSoftYanlz/article/details/82469850
++++Oculus安装使用:https://blog.csdn.net/VRunSoftYanlz/article/details/82718982
++++Unity+SteamVR=>VR:https://blog.csdn.net/VRunSoftYanlz/article/details/88809370
++++Unity减少VR晕眩症:https://blog.csdn.net/VRunSoftYanlz/article/details/89115518
++++SteamVR简介:https://blog.csdn.net/VRunSoftYanlz/article/details/86484254
++++SteamVR脚本功能分析:https://blog.csdn.net/VRunSoftYanlz/article/details/86531480
++++SteamVR2.0开发指南:https://blog.csdn.net/VRunSoftYanlz/article/details/86618187
++++SteamVR2.2.0开发指南:https://blog.csdn.net/VRunSoftYanlz/article/details/88784527
++++SteamVR2.2.0快速入门:https://blog.csdn.net/VRunSoftYanlz/article/details/88833579
++++SteamVR2.2.0交互系统:https://blog.csdn.net/VRunSoftYanlz/article/details/89199778
++++SteamVR2.2.0传送机制:https://blog.csdn.net/VRunSoftYanlz/article/details/89390866
++++SteamVR2.2.0教程(一):https://blog.csdn.net/VRunSoftYanlz/article/details/89324067
++++SteamVR2.2.0教程(二):https://blog.csdn.net/VRunSoftYanlz/article/details/89894097
++++SteamVR_Skeleton_Poser:https://blog.csdn.net/VRunSoftYanlz/article/details/89931725
++++SteamVR实战之PMCore:https://blog.csdn.net/VRunSoftYanlz/article/details/89463658
++++SteamVR/Extras:https://blog.csdn.net/VRunSoftYanlz/article/details/86584108
++++SteamVR/Input:https://blog.csdn.net/VRunSoftYanlz/article/details/86601950
++++OpenXR简介:https://blog.csdn.net/VRunSoftYanlz/article/details/85726365
++++VRTK杂谈:https://blog.csdn.net/VRunSoftYanlz/article/details/82562993
++++VRTK快速入门(杂谈):https://blog.csdn.net/VRunSoftYanlz/article/details/82955267
++++VRTK官方示例(目录):https://blog.csdn.net/VRunSoftYanlz/article/details/82955410
++++VRTK代码结构(目录):https://blog.csdn.net/VRunSoftYanlz/article/details/82780085
++++VRTK(SceneResources):https://blog.csdn.net/VRunSoftYanlz/article/details/82795400
++++VRTK_ControllerEvents:https://blog.csdn.net/VRunSoftYanlz/article/details/83099512
++++VRTK_InteractTouch:https://blog.csdn.net/VRunSoftYanlz/article/details/83120220
++++虚拟现实行业应用:https://blog.csdn.net/VRunSoftYanlz/article/details/88360157
++++Steam平台上的VR:https://blog.csdn.net/VRunSoftYanlz/article/details/88960085
++++Steam平台热销VR:https://blog.csdn.net/VRunSoftYanlz/article/details/89007741
++++VR实验:以太网帧的构成:https://blog.csdn.net/VRunSoftYanlz/article/details/82598140
++++实验四:存储器扩展实验:https://blog.csdn.net/VRunSoftYanlz/article/details/87834434
++++FrameVR示例V0913:https://blog.csdn.net/VRunSoftYanlz/article/details/82808498
++++FrameVR示例V1003:https://blog.csdn.net/VRunSoftYanlz/article/details/83066516
++++SwitchMachineV1022:https://blog.csdn.net/VRunSoftYanlz/article/details/83280886
++++PlaySceneManagerV1022:https://blog.csdn.net/VRunSoftYanlz/article/details/83280886
++++Unity5.x用户手册:https://blog.csdn.net/VRunSoftYanlz/article/details/81712741
++++Unity面试题ABC:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++Unity面试题D:https://blog.csdn.net/VRunSoftYanlz/article/details/78630838
++++Unity面试题E:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity面试题F:https://blog.csdn.net/VRunSoftYanlz/article/details/78630945
++++Cocos2dx面试题:https://blog.csdn.net/VRunSoftYanlz/article/details/78630967
++++禅道[zentao]:https://blog.csdn.net/VRunSoftYanlz/article/details/83964057
++++Lua快速入门篇(Xlua拓展):https://blog.csdn.net/VRunSoftYanlz/article/details/81173818
++++Lua快速入门篇(XLua教程):https://blog.csdn.net/VRunSoftYanlz/article/details/81141502
++++Lua快速入门篇(基础概述):https://blog.csdn.net/VRunSoftYanlz/article/details/81041359
++++框架知识点:https://blog.csdn.net/VRunSoftYanlz/article/details/80862879
++++游戏框架(UI框架夯实篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80781140
++++游戏框架(初探篇):https://blog.csdn.net/VRunSoftYanlz/article/details/80630325
++++.Net框架设计:https://blog.csdn.net/VRunSoftYanlz/article/details/87401225
++++从零开始学架构:https://blog.csdn.net/VRunSoftYanlz/article/details/88095895
++++设计模式简单整理:https://blog.csdn.net/vrunsoftyanlz/article/details/79839641
++++专题:设计模式(精华篇):https://blog.csdn.net/VRunSoftYanlz/article/details/81322678
++++U3D小项目参考:https://blog.csdn.net/vrunsoftyanlz/article/details/80141811
++++Unity小游戏算法分析:https://blog.csdn.net/VRunSoftYanlz/article/details/87908365
++++Unity案例(Vehicle):https://blog.csdn.net/VRunSoftYanlz/article/details/82355876
++++UML类图:https://blog.csdn.net/vrunsoftyanlz/article/details/80289461
++++PowerDesigner简介:https://blog.csdn.net/VRunSoftYanlz/article/details/86500084
++++Unity知识点0001:https://blog.csdn.net/vrunsoftyanlz/article/details/80302012
++++Unity知识点0008:https://blog.csdn.net/VRunSoftYanlz/article/details/81153606
++++U3D_Shader编程(第一篇:快速入门篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372071
++++U3D_Shader编程(第二篇:基础夯实篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372628
++++Unity引擎基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78881685
++++Unity面向组件开发:https://blog.csdn.net/vrunsoftyanlz/article/details/78881752
++++Unity物理系统:https://blog.csdn.net/vrunsoftyanlz/article/details/78881879
++++Unity2D平台开发:https://blog.csdn.net/vrunsoftyanlz/article/details/78882034
++++UGUI基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78884693
++++UGUI进阶:https://blog.csdn.net/vrunsoftyanlz/article/details/78884882
++++UGUI综合:https://blog.csdn.net/vrunsoftyanlz/article/details/78885013
++++Unity动画系统基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78886068
++++Unity动画系统进阶:https://blog.csdn.net/vrunsoftyanlz/article/details/78886198
++++Navigation导航系统:https://blog.csdn.net/vrunsoftyanlz/article/details/78886281
++++Unity特效渲染:https://blog.csdn.net/vrunsoftyanlz/article/details/78886403
++++Unity数据存储:https://blog.csdn.net/vrunsoftyanlz/article/details/79251273
++++Unity中Sqlite数据库:https://blog.csdn.net/vrunsoftyanlz/article/details/79254162
++++WWW类和协程:https://blog.csdn.net/vrunsoftyanlz/article/details/79254559
++++Unity网络:https://blog.csdn.net/vrunsoftyanlz/article/details/79254902
++++Unity资源加密:https://blog.csdn.net/VRunSoftYanlz/article/details/87644514
++++PhotonServer简介:https://blog.csdn.net/VRunSoftYanlz/article/details/86652770
++++编写Photon游戏服务器:https://blog.csdn.net/VRunSoftYanlz/article/details/86682935
++++C#事件:https://blog.csdn.net/vrunsoftyanlz/article/details/78631267
++++C#委托:https://blog.csdn.net/vrunsoftyanlz/article/details/78631183
++++C#集合:https://blog.csdn.net/vrunsoftyanlz/article/details/78631175
++++C#泛型:https://blog.csdn.net/vrunsoftyanlz/article/details/78631141
++++C#接口:https://blog.csdn.net/vrunsoftyanlz/article/details/78631122
++++C#静态类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630979
++++C#中System.String类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630945
++++C#数据类型:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity3D默认的快捷键:https://blog.csdn.net/vrunsoftyanlz/article/details/78630838
++++游戏相关缩写:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++UnityAPI.Rigidbody刚体:https://blog.csdn.net/VRunSoftYanlz/article/details/81784053
++++UnityAPI.Material材质:https://blog.csdn.net/VRunSoftYanlz/article/details/81814303
++++UnityAPI.Android安卓:https://blog.csdn.net/VRunSoftYanlz/article/details/81843193
++++UnityAPI.AndroidJNI安卓JNI:https://blog.csdn.net/VRunSoftYanlz/article/details/81879345
++++UnityAPI.Transform变换:https://blog.csdn.net/VRunSoftYanlz/article/details/81916293
++++UnityAPI.WheelCollider轮碰撞器:https://blog.csdn.net/VRunSoftYanlz/article/details/82356217
++++UnityAPI.Resources资源:https://blog.csdn.net/VRunSoftYanlz/article/details/83155518
++++JSON数据结构:https://blog.csdn.net/VRunSoftYanlz/article/details/82026644
++++CocosStudio快速入门:https://blog.csdn.net/VRunSoftYanlz/article/details/82356839
++++Unity企业内训(目录):https://blog.csdn.net/VRunSoftYanlz/article/details/82634668
++++Unity企业内训(第1讲):https://blog.csdn.net/VRunSoftYanlz/article/details/82634733
++++Unity企业内训(第2讲):https://blog.csdn.net/VRunSoftYanlz/article/details/82861180
++++Unity企业内训(第3讲):https://blog.csdn.net/VRunSoftYanlz/article/details/82927699
++++Unity企业内训(第4讲):https://blog.csdn.net/VRunSoftYanlz/article/details/83479776
++++Unity企业内训(第5讲):https://blog.csdn.net/VRunSoftYanlz/article/details/83963811
++++Unity企业内训(第6讲):https://blog.csdn.net/VRunSoftYanlz/article/details/84207696
++++钻哥带您了解产品原型:https://blog.csdn.net/VRunSoftYanlz/article/details/87303828
++++插件<Obi Rope>:https://blog.csdn.net/VRunSoftYanlz/article/details/83963905
++++计算机组成原理(教材篇):https://blog.csdn.net/VRunSoftYanlz/article/details/82719129
++++5G接入:云计算和雾计算:https://blog.csdn.net/VRunSoftYanlz/article/details/88372718
++++云计算通俗讲义:https://blog.csdn.net/VRunSoftYanlz/article/details/88652803
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
--_--VRunSoft:lovezuanzuan--_--