java数据结构与算法

今天的突然看集合底层的时候发现了好多算法和数据结构。再次就比较一下和汇总一下。
数据结构分类:线性结构和非线性结构
问题一:
什么是线性和非线性;
我个人的理解是:数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构;
线性结构包括:数组,链表,队列,栈;
非线性结构包括:树,图,表;
详解:
一.线性结构
1.数组
特点:我们都知道数组中的元素在内存中连续存储的,可以根据是下标快速访问元素,因此,查询速度很快,然而插入和删除时,需要对元素移动空间,比较慢。
数组使用场景:频繁查询,很少增加和删除的情况。
2.链表
特点:元素可以不连续内存中,是以索引将数据联系起来的,当查询元素的时候需要从头开始查询,所以效率比较低,然而添加和删除的只需要修改索引就可以了
使用场景:少查询,需要频繁的插入或删除情况
3.队列
特点:先进先出,
使用场景:多线程阻塞队列管理非常有用
4.栈
特点:先进后出,就像一个箱子,
使用场景:实现递归以及表示式
5.数组与链表的区别
数组连续,链表不连续(从数据存储形式来说)
数组内存静态分配,链表动态分配
数组查询复杂度0(1),链表查询复杂度O(n)
数组添加或删除,复杂度o(n),链表添加删除,复杂度O(1)
数组从栈中分配内存。链表从堆中分配内存。
 
二。算法分类:
1)插入排序(直接插入排序、希尔排序) 
2)交换排序(冒泡排序、快速排序) 
3)选择排序(直接选择排序、堆排序) 
4)归并排序 
5)分配排序(基数排序)
所需辅助空间最多:归并排序 
所需辅助空间最少:堆排序 
平均速度最快:快速排序 
不稳定:快速排序,希尔排序,堆排序。 
 1.直接插入排序 
(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 
好顺序的,现在要把第n 个数插到前面的有序数中,使得这 n个数 
也是排好顺序的。如此反复循环,直到全部排好顺序。 
/** * 插入排序法 * * @param datas */ public static int [] sortInsert( int [] datas) { for ( int i = 1; i < datas.length; i++) { int j = i - 1; AlgorithmUtil.temp = datas[i]; for (; j >= 0 && AlgorithmUtil.temp < datas[j]; j--) { datas[j + 1] = datas[j]; } datas[j + 1] = AlgorithmUtil.temp; } return datas; }
 
2.简单选择排序 
(1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换; 
然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一
个数比较为止。 
/** * 选择排序 * * @return */ public static int [] sortSelect( int [] datas) { for ( int i = 0; i < datas.length; i++) { int index = i; for ( int j = i + 1; j < datas.length; j++) { if (datas[j] < datas[index]) index = j; } if (i != index) AlgorithmUtil.swap(datas, i, index); } return datas; }
3.冒泡排序
(1)基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对
相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的
数比较后发现它们的排序与排序要求相反时,就将它们互换。
/** * 冒泡排序 * * @return */ public static int [] sortBubble( int [] datas) { for ( int i = 0; i < datas.length - 1; i++) { for ( int j = 0; j < datas.length - 1 - i; j++) { if (datas[j] > datas[j + 1]) AlgorithmUtil.swap(datas, j, j + 1); } } return datas; }
4.快速排序
(1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,
将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其
排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
/** * 快速排序;分割数组 * * @param datas */ public static int QuickPartition( int [] datas, int left, int right) { int pivot = datas[left]; while (left < right) { while (left < right && datas[right] >= pivot) --right; datas[left] = datas[right]; // 将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上 while (left < right && datas[left] <= pivot) ++left; datas[right] = datas[left]; // 将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上 } datas[left] = pivot; // 当left == right,完成一趟快速排序,此时left位相当于空,等待pivotkey补上 return left; } /** * 快速排序;递归返回数组 * * @param datas */ public static int [] sortQuick( int [] datas, int left, int right) { if (left < right) { int data = QuickPartition(datas, left, right); sortQuick(datas, left, data - 1); sortQuick(datas, data + 1, right); } return datas; }
 
1.冒泡算法,2.选择算法,3.快速算法。4.插入算法,5.希尔算法,6.堆算法
 
public class AlgorithmUtil { public static int temp,index = 0; /** * 临时值交换 * * @param datas * 数组 * @param i * @param j */ public static void swap( int [] datas, int i, int j) { temp = datas[i]; datas[i] = datas[j]; datas[j] = temp; } /** * 扩充数组长度 * * @param datas * @param value * @return */ public static int [] expandArray( int [] datas, int value) { if (datas.length <= index) { int [] arrays = new int [datas.length * 2]; System.arraycopy(datas, 0, arrays, 0, datas.length); datas = arrays; } datas[index] = value; index++; return datas; } }

Java基础系列课程 ppt 和 源码 Java数据结构和算法第七讲.avi Java数据结构和算法第三十一讲.avi Java数据结构和算法第三十七讲.avi Java数据结构和算法第三十三讲.avi Java数据结构和算法第三十九讲.avi Java数据结构和算法第三十二讲.avi Java数据结构和算法第三十五讲.avi Java数据结构和算法第三十八讲.avi Java数据结构和算法第三十六讲.avi Java数据结构和算法第三十四讲.avi Java数据结构和算法第三十讲.avi Java数据结构和算法第九讲.avi Java数据结构和算法第二十一讲.avi Java数据结构和算法第二十七讲.avi Java数据结构和算法第二十三讲.avi Java数据结构和算法第二十九讲.avi Java数据结构和算法第二十二讲.avi Java数据结构和算法第二十五讲.avi Java数据结构和算法第二十八讲.avi Java数据结构和算法第二十六讲.avi Java数据结构和算法第二十四讲.avi Java数据结构和算法第二十讲.avi Java数据结构和算法第八讲.avi Java数据结构和算法第六讲.avi Java数据结构和算法第十一讲.avi Java数据结构和算法第十七讲.avi Java数据结构和算法第十三讲.avi Java数据结构和算法第十九讲.avi Java数据结构和算法第十二讲.avi Java数据结构和算法第十五讲.avi Java数据结构和算法第十八讲.avi Java数据结构和算法第十六讲.avi Java数据结构和算法第十四讲.avi Java数据结构和算法第十讲.avi Java数据结构和算法第四十一讲.avi Java数据结构和算法第四十三讲.avi Java数据结构和算法第四十二讲.avi Java数据结构和算法第四十四讲.avi Java数据结构和算法第四十讲.avi 第一讲.exe 第三讲.exe 第二讲.exe 第五讲.exe 第四讲.exe
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。 想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。 开这个系列的目的是为了自我不断积累。不积跬步无以至千里嘛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值