算法学习笔记
学习算法过程中的一些知识点总结记录。
程序员小赵同学
大道至简,盘古生其中。
展开
-
算法基础入门 - 9、复杂排序算法-堆排序
堆排序什么是堆排序?1、先让整个数组都变成大(小)根堆结构2、把堆的最大值和堆末尾的值交换,减少堆的大小。再去调整堆。3、堆的大小减为0之后,排序完成。时间复杂度O(n*logn)堆排序的练习题:已知一个几乎有序的数组,请选择一个合适的排序算法针对这个数据进行排序。几乎有序:如果吧数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。首先是Java版本的解法:package com.leftGod;import java.util.Arrays;i原创 2022-04-04 23:03:52 · 987 阅读 · 3 评论 -
算法基础入门 - 8、复杂排序算法-堆结构介绍+自定义堆+java堆
堆结构堆结构就是用数组实现的特殊的完全二叉树结构:有右子节点时,必有左子节点每个父节点都大于等于子节点(或者每个父节点都小于等于子节点)我们的数据在逻辑上可以根据数组的索引构建出一颗完全二叉树,节点和索引之间的位置关系是:i位置节点的父节点在数组中的位置是**(i-1)/2**i位置节点的左孩子在数组中的位置是**(i*2)+1**i位置节点的右孩子在数组中的位置是**(i*2)+2**堆的类型有两种:大根堆:父节点的值比左右子节点的值都要大小根堆:父节点的值比左右子节点的原创 2022-04-03 02:07:25 · 631 阅读 · 0 评论 -
算法基础入门 - 7、复杂排序算法-归并排序
归并排序先使部分有序,最后再合并每个部分,让整体有序。(让其整体有序的过程采用了外排序的方式)时间复杂度:O(n*log(n)) 空间复杂度O(n)下面通过两道归并排序的算法题来深入理解归并排序算法:1、小和问题在一个数组中,每一个数左边比当前数小的数,累加起来,就叫做这个数的小和。如:[1,3,2,4],1左边没有值,所以没有小和3左边,1比3小,所以3的小和是12左边,1比2小,所以2的小和也是14左边,都比4小,所以4的小和为1+3+2=6所以整个数组的小和=1+1+原创 2022-03-29 20:39:27 · 490 阅读 · 0 评论 -
算法基础入门 - 6、复杂排序算法-快速排序
快速排序初识快速排序下面我们两道简单算法题引入快速排序的概念1、给定一个数组和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求:时间复杂度O(n) 额外空间复杂度O(1)//记录一个分割线的位置,分割线左边都是小于等于的,分割线右边都是大于的public void preQuickSort(int[] arr, int target) { //分割点和数组下标 int splitPoint=0, index=0; while(i原创 2022-03-30 23:43:17 · 416 阅读 · 0 评论 -
算法基础入门 - 5、递归行为和Master公式
5、递归行为和Master公式递归:在运行过程中不断的调用自己凡是标准的递归流程,都可以直接使用Master公式求解时间复杂度。master公式如下:![image.png](https://img-blog.csdnimg.cn/img_convert/497fc5d6b9d2f626b2bf327795d2d0f7.png#clientId=udb460ad5-55c5-4&crop=0&crop=0&crop=1&crop=1&from=paste原创 2022-03-24 19:53:08 · 530 阅读 · 0 评论 -
算法基础入门 - 4、二分算法
4、二分算法主要思想:每次查询都能缩减一半的范围时间复杂度:O(log n) ; 空间复杂度O(1):首先的一个问题:是不是只有排好序的元素才能使用二分算法?下面的第三道算法题会回答这个问题!1、在一个有序数组中找某个数是否存在经典二分算法,无需查找至最后一个值。遍历过程中如果发现了target,直接返回。解题思路:1、因为是有序数组,直接找中点下标mid2、若arr[mid] 比我们的目标值大,说明我们的目标值在[0, mid-1]区间3、若arr[mid] 比我们的目标值小,原创 2022-03-24 19:51:24 · 275 阅读 · 0 评论 -
算法基础入门 - 3、简单排序算法(选择、冒泡、插入)
3、简单排序算法选择排序主要思想:将当前值和 之后的每一个值相比较时间复杂度:O(n2) 空间复杂度:O(1)public void selectSort(int[] arr) { int len = arr.length; for(int i = 0; i < len-1; i++) { for(int j = i+1; j < len; j++){ if(arr[i] > arr[j]) {原创 2022-03-24 00:57:22 · 652 阅读 · 0 评论 -
算法基础入门 - 2、异或运算的性质与扩展
2、异或运算的性质与扩展异或又被叫做:模二运算(相加不进位)异或的特性a ^ a = 0a ^ 0 = aa ^ b = b ^ a(a ^ b) ^ c = a ^ (b ^ c)通过一个demo熟悉上面的特性public void swap(int[] arr, int i, int j) { arr[i] = arr[i] ^ arr[j]; //arr[i] = arr[i] ^ arr[j]; arr[j] = arr[j] arr[j] = arr[i] ^ arr[原创 2022-03-23 00:35:37 · 489 阅读 · 0 评论 -
算法基础入门 - 1、认识时间复杂度
1、认识时间复杂度常数操作一个操作如果和样本的数据量没有关系,每次都是固定时间内完成操作,就叫做常数操作要首先总结出常数操作数量的表达式;在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数;剩下的部分如果为f(n),那么时间复杂度为O(f(n))当两个算法的时间复杂度都是f(n)时,不能仅仅比较常数项,如下面的f1和f2方法,f1的常数项比f2小,但是加减乘除运算是比位运算要慢很多的,所以,当时间复杂度相等时,不要比较常数项,而是应该实际去跑两个算法,实际对比哪个性能更优。public .原创 2022-03-23 00:34:53 · 181 阅读 · 0 评论