![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 58
dxj1016
好好学习,天天向上
展开
-
二叉树的存储方式和遍历方式
二叉树的存储方式链式存储链式存储就是使用指针,通过指针把分布在散落在各个地址的结点串联一起。链式存储的二叉树数据结构:public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) {原创 2021-11-25 13:48:36 · 456 阅读 · 0 评论 -
二叉树的判断
二叉树的判断二叉树判断中序遍历如果总是升序,那他肯定是二叉树,如果出现某个降序,他肯定不是二叉树/** * 递归判断是否为二叉树 * @param head * @return */ public static boolean checkBST(Node head) { int preValue = Integer.MIN_VALUE; if (head == null) { return true原创 2021-11-25 13:43:59 · 365 阅读 · 0 评论 -
排序算法的稳定性
15、排序算法的稳定性稳定性:就是一个数组元素在拍完序之后原来相同的元素的位置依然相对存在,比如数组有两个1,有前后区别,拍完序后在前面的1依然是在前面能用快排就用快排15.1、常见的坑15.2、快速排序稳定性的坑:经典快排 的part tation做不到稳定性;但是经典快排的parttation又是01标准,他和这奇偶问题其实是一种调整策略 ,快排做不到工具类中的排序方法Arrays.sort();如果使用的是基础类型的数据,使用的是快排,如果不是基础类型使用的是归并排序;为什原创 2021-11-25 13:28:44 · 261 阅读 · 0 评论 -
桶排序、基数排序
13、桶排序14、基数排序找数组中最大的元素看他是几位数,然后对其它元素在前面补0成最大元素的相同位数然后准备桶,先根据各位数字来,看数字是啥就对应几号桶,然后将桶里的元素从左到右导出来,然后根据十位数的数字来,看数值是啥就对应几个号桶,然后将桶中的元素从左到右导出来,然后再根据百位数进行,最后导出来就是排好序的数组元素。优化:先用一个count的数组放元素的个位数有几个。比如013的个位数是3,所以在3的位置标1;021的个位数是1所以在1的位置标1,011的个位数是1,所以在1的位置标1原创 2021-11-25 13:26:36 · 578 阅读 · 0 评论 -
认识堆和堆排序
10、堆10.1、完全二叉树10.2、大跟堆在一个完全二叉树里,每一颗子树的最大值就是头结点的值,满足这个条件就是大跟堆。10.3、小跟堆在一个完全二叉树中,每一颗子树的最小值就是他的头结点,满足这个条件就是小跟堆。怎么让一个完全二叉树变成大跟堆呢?一开始heapsize是为0的,然后5进来的时候,就放到heapsize为0的位置,然后heapsize变为1了,再进来一个数3的时候,将其放到heapsize为1的位置,然后heapsieze变为2;在进来6的时候,将其放到heapsize原创 2021-11-25 13:24:43 · 474 阅读 · 0 评论 -
认识快速排序
9、快速排序快排1.0:找一个轴值,大于轴值的在右边递归,小于等于轴值的时候在左边递归;空间复杂度:快排2.0:找一个轴值,大于轴值的在右边递归,小于轴值的在左边递归,等于轴值的不用动位置。快排3.0:概率package 左神算法.快速排序;public class QuickSort { public static void main(String[] args) { int[] arr2 = {3, 5, 0, 3, 4, 5, 2, 6, 9, 6};原创 2021-11-25 13:23:02 · 71 阅读 · 0 评论 -
认识归并排序
8、归并排序先分解,然后合并的时候是先看两边的有没有都越界,没有越界就比较p1和p2的值,哪个小就哪个先放到help中;可能会出现一个越界一个不越界的情况,所以就有两个while判断其中一个不越界的情况,就将元素添加到help新数组中;最后变量help数组中元素将其拷贝到之前的数组中完成排序。时间复杂度符合master公式;看递归了两次分解函数,而且每次递归规模都是1/2;所以a=2;b=2;然后就看常数项的,主要看 合并函数的时间复杂度了,合并的时候是遍历了整个数组,所以是O(N),所以d=1原创 2021-11-25 13:21:28 · 267 阅读 · 0 评论 -
认识递归行为
7、递归行为7.1、中间数的求法:如果直接(L+R)/2,如果L和R非常大的时候,可能出现溢出,这里的溢出是超过int范围的一个溢出;所以可以使用以下的两种方法求解。7.2、求数组L-R范围上求最大值package 左神算法.递归行为;public class GetMax { public static void main(String[] args) { int[] arr = {4, 12, 56, 2, 6, 8, 29}; System.o原创 2021-11-25 13:17:49 · 116 阅读 · 0 评论 -
认识二分法
5、二分法时间复杂度:O(logn)5.1、有序数组找某数是否存在题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。class Solution { public int search(int[] nums, int target) { int left = 0, right = nums.length; while (left &原创 2021-11-25 13:15:25 · 346 阅读 · 0 评论 -
认识时间复杂度和异或运算
认识时间复杂度和异或运算1、时间复杂度:取最高阶的,当一样的时候就不看时间复杂度了,直接代码运行测试看哪个更快就是时间复杂度更好时间复杂度一律按照最差时间复杂度进行计算,就跟冒泡排序和选择排序,他们的时间复杂度都是O(n^2) ;但是插入排序如果在数组原本有序的情况下进行插入排序,那么他的时间复杂度是O(n),但是最坏的情况下,就是元素刚好是倒序,那么你要排序,就要都交换一遍;所以最坏的时间复杂度是O(n^2);2、空间复杂度:如果是有限的数,那么不需要开额外的空间就是o(1);如果是数组需要开一原创 2021-11-25 13:12:27 · 1567 阅读 · 1 评论