基础算法
此专栏以基础算法为主
琅晓琳
计算机软件编程,主要编程语言有C++,python和java,之前从事深度学习研究,有caffe开发基础,目前从事数据库的开发和维护。
展开
-
写在前面的话-前言
写在前面的话: 码龄4年,应该是申请注册CSDN账号4年了,期间看过很多文章,关注了一些大牛。 自己一直信奉的宗旨就是“好记性不如烂笔头”,结果的结果记录了一些内容,但是始终形成不了体系,自己也没有写过博客,结果就是“狗熊掰玉米”。技术就是要总结,要交流,即将迈入2021年了,自己也想总结点东西,写点人生感悟,就像“人生短短急个球”,“不醉不罢休”一样,嘻嘻哈哈。祝愿自己的新一年一切顺利,学到更多东西吧,这东西不止技术,还有各种有用的东东吧,加油!你以为这就结束了NONONO...原创 2020-12-28 22:24:22 · 179 阅读 · 2 评论 -
基础算法系列 之树结构概述及简单实现
树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构。基础概念:如图:(图片参考网络)根结点:A即是根结点;父结点(双亲结点):B即是E/F的父结点;结点的度:结点的分支数量,即结点的子树数,如结点B下面有两个子树,所以度为2,同理A结点度为3,结点度的最大值即是树的度;结点的权:指的是结点的权重;叶子结点:没有子结点的结点;高度:最大的层数,例如上面树的高度为4;二叉树:任何一个结点的子结点数量<=2,子结点分为左结点和右节点,左右结点不原创 2021-02-11 17:02:00 · 127 阅读 · 0 评论 -
基础算法系列 之斐波那契和汉诺塔
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……其代码如下:public class Fibonacci{ public static int fibonacci(int i){ if(i==1 || i==2){ //递归问题一定要有终止条件 return 1; }else{原创 2021-01-31 14:04:36 · 360 阅读 · 2 评论 -
基础算法系列 之双向循环链表
双向链表(双链表)是链表的一种,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向后继节点和前驱节点。借图说话:图片来自于https://www.cnblogs.com/rongweijun/p/8072677.html,感谢大神的图片。其代码如下:public class DoubleNode{ DoubleNode pre=this; DoubleNode next=this; int data; public DoubleNode(int data){ this.da原创 2021-01-31 13:45:00 · 124 阅读 · 0 评论 -
基础算法系列 之单链表
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素,每个结点的构成:元素 + 指针。其代码如下:public class Node{ int data; Node next; public Node(int data){ this.data=data; } public void *append*(Node node){ //追加节点 Node currentNode=this; while(true){ Node cnode=currentNode原创 2021-01-31 11:18:11 · 104 阅读 · 0 评论 -
基础算法系列 之栈和队列
栈和队列严格意义上来说也属于线性表,因为它们也都用于存储逻辑关系为 “一对一” 的数据,其中栈为先进后出,队列为先进先出。其代码如下:public class myStack{ private int[]elements; public myStack(){ elements=new int[0]; } public void push(int element){ //进栈 int[]newArray=new int[elements.length+1]; //末尾添加 for(int原创 2021-01-30 19:56:53 · 83 阅读 · 0 评论 -
基础算法系列 之线性查找
本文中介绍的线性查找为二分法查找方式,前提要求数组或者序列是有序的。二分法查找是查找方式中效率较高的一种,时间复杂度是logN,推导过程比较简单,设次数为x,N*(1/2)^x=1(之所以等于1,是考虑到最坏情况,查找到最后只剩下1个元素);则x=logN,底数是2。其代码如下:public int getIndex(int[]arr,int value){ int min=0; int max=arr.length-1; int mid=(min+max)/2; while(true){ i原创 2021-01-30 17:53:51 · 97 阅读 · 0 评论 -
基础算法系列 之基数排序
基数排序是一种独立的排序思想,其排序准则就是“按位分组,再行排序”,适用于不同位数的排序。其代码如下:public static void radixSort(int[]arr){ int [][] temp = new int[10][arr.length]; int max = Integer.MIN_VALUE; //存最大数 int [] counts = new int[10]; for(int i=0;i<arr.length;i++){ if(arr[i] > max原创 2021-01-24 11:47:14 · 76 阅读 · 0 评论 -
基础算法系列 之归并排序
归并排序是一种独立的排序思想,其排序准则就是“先行拆分,小组排序;之后归并,再行排序”。代码如下:public static void merge(int[]arr,int low,int m,int high){ int[]temp=new int[high-low+1]; int i=low; int j=m+1; int index=0; while(i<=m && j<=high){ if(arr[i]<=arr[j]){ temp[inde原创 2021-01-23 17:14:26 · 74 阅读 · 0 评论 -
基础算法系列 之希尔排序
希尔排序和上文中的直接插入一样,都是插入排序的一种。之前直接插入排序的缺点是假如小数在靠后的位置,则其前面的数都要前提,希尔排序则是先取步长,这样可以减少移动的次数。希尔排序的准则就是“先取步长,再分小组;以组为准,组内排序”。基本代码如下:public static void shellSort(int[]arr){ for(int d=arr.length/2;d>0;d/=2){ //遍历所有步长 for(int i=d;i<arr.length;i++){ //遍历所有元素原创 2021-01-02 17:46:55 · 169 阅读 · 0 评论 -
基础算法系列 之插入排序
直接插入排序和希尔排序一样,都是插入排序的一种。按照难易程度先整理下直接插入排序,希尔排序后续安排。直接插入排序的准则就是“遍历数字,找出基准;以此为点,依次移动”。基本代码如下:public static void insertSort(int[]arr){ for(int i=1;i<arr.length;i++){ //遍历所有数字 if(arr[i]<arr[i-1]{ //如果当前数字比前个小 int temp = arr[i]; for(int j=i-1;原创 2021-01-02 17:07:18 · 81 阅读 · 0 评论 -
基础算法系列 之快速排序
快速排序和冒泡排序一样,也是交换排序的一种。快速排序的准则就是“找基准数,大小分开;分而治之,递归使用”。基本代码如下:public static void quickSort(int[]arr,int start,int end){ if(start < end){ int stard = arr[start]; //找到基准数 int low = start; //定义排序下标和上标 int high = end; while(low < high){ whi原创 2021-01-01 11:37:47 · 92 阅读 · 0 评论 -
基础算法系列 之选择排序
选择排序也是入门算法必学的内容,和冒泡排序一样,都是基础算法开篇内容。与冒泡排序的相同点是时间复杂度都是O(n*n),不同点是可能所属的排序类别不同,冒泡排序和快速排序都是交换排序系列,简单选择排序和堆排序都是选择排序系列。选择排序的准则就是“双重循环,两轮控制;定一对比,大小换序”基本代码如下:public static void selectSort(int[]arr){ for(int i=0;i<arr.length;i++){ //控制轮次 for(int j=i+1;j&l原创 2020-12-30 21:43:57 · 138 阅读 · 0 评论 -
基础算法系列 之冒泡排序
冒泡排序是入门算法必学的内容,就像练guitar时的“兰花草”和“恰似你的温柔”一样,都是基础开篇内容。冒泡排序的准则就是“大数沉淀,小数冒泡;双重循环,两轮控制。”基本代码如下:public static void bubbleSort(int[]arr){ for(int i=0;i<arr.length-1;i++){ //控制轮次 for(int j=0;j<arr.length-1-i;j++){ //两个数依次比较 if(arr[j]>arr[j+1]){原创 2020-12-29 21:50:05 · 110 阅读 · 0 评论