![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
别拦着我,我要学习
这个作者很懒,什么都没留下…
展开
-
插值插找(对比二分法查找)
插值查找:二分查找其效率已经远远高于线性查找,但是我们还可以通过插值查找对二分法查找进行优化。在二分查找中,mid是(left+right)/2,我i们可以按比例缩小范围,使得我们可以经过更少的次数完成查找。将mid设置为:left + (right-left)*(value-arr[left])/ (arr[right] - arr[left])。需要注意的是,我们的数组依旧是有序数组,当我们的数组元素全部一样时,此方法不适用。因为除数为0了。代码如下:public static ArrayLi原创 2020-11-19 13:25:21 · 425 阅读 · 0 评论 -
二分法查找(递归实现)
二分查找给定一个有序数组,在数组中查找是否存在给定的一个整数,如果存在则返回数组中全部等于该数的数的索引。思路:将数组从某个位置一分为2,判断是否大于该位置的数。若等于,则创建一个集合,将该位置的索引放入集合,并向左搜索,若相等,继续将索引放入集合,直到发现一个数小于该数,则停止;之后继续向右搜索,,继续将索引放入集合,直到发现一个数大于该数,则停止,并返回集合。如果发现如果大于,则重复之前的步骤,将后半部分继续按某个位置分为两部分,若小于,也继续重复上面的步骤。最终返回的集合中的元素就是我们想要的一原创 2020-11-19 12:20:57 · 1423 阅读 · 0 评论 -
基数排序(桶排序)
基数排序:索引待比较数值统一为同样的数位长度,数位较短的数前面补零,然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有效序列。简单来说,就是设置10个桶,将待比较数字的个位拿来比较,按个位的数值依次按0~ 9的不同依次放入桶中,然后再按0~9从桶中按顺序取出,再按十位放、百位、依次进行,直到最大的数,最高位数这一次也完成并按顺序取出,得到的结果就是一个有序数列。在此仅讨论数组中元素为正数,若为负数,则分为负数,正数两部分,负数取绝对值,按以上方法从大到小排好原创 2020-11-18 21:33:37 · 105 阅读 · 0 评论 -
快速排序思路及代码实现
快速排序基本思想是:通过一趟排序将要排序的数据结构分割成独立的两部分,其中一部分的所有数据都比另外一个部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归实现,从而达到整个数据变成有序序列。通过八万个数据进行测试,发现其速度约为30毫秒,其速度与希尔排序中的位移法较为接近。public static void QuickSort(int arr[],int left,int right){ int r=right; int l=left原创 2020-11-18 13:30:02 · 97 阅读 · 0 评论 -
交换式希尔排序与位移式希尔排序
希尔排序:希尔排序也是一种插入算法,它是简单的插入排序经过改进之后的一个更高效的版本,也成为缩小增量排序。希尔排序式把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少。每组包含的关键词越来越多,当增量减至1时,整个文件被分为一组,算法便中止.交换式希尔排序:通过八万个数据进行测试,时长大概为8秒左右,仅快于冒泡排序public static void shellSort(int[] arr){ int num; int temp=0;原创 2020-11-18 03:12:11 · 136 阅读 · 0 评论 -
插入排序及两种不同实现方法对比
插入排序:插入排序的思想:插入排序的基本思想是:把n个待排序的元素看成一个有序表和一个无序表,开始时有序表只包含一个元素,无需表中包含n-1个元素.排序过程中,每次从无序表中取出第一个元素,把他的排序码一次与有序表元素的排序码码进行比较,将其插入到适当的位置,使之成为一个新的有序表用八万个数据进行测试,使用时间为4秒作用,略慢于选择排序,但是比冒泡排序速度要快很多。并在下面会贴出另一种写法,速度会快于选择排序代码如下:public static void insertSort(int[] arr)原创 2020-11-17 21:00:32 · 278 阅读 · 0 评论 -
选择排序
选择排序:选择排序也是一种简单的排序方法。他的基本思想是:第一次从arr[0]arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[i]arr[n-1]中选取最小值与arr[0]交换,第二次从arr[1]~arr[n-1]中选取最小值与arr[1]交换,通过n-1此,得到一个从小到大的排列。测试八万个数据进行排序,所需要的时间大致为2.5~3秒,相较于冒泡排序,时间降低很多。代码如下:public static void selectSort(int[] arr){ in原创 2020-11-17 17:58:18 · 79 阅读 · 1 评论 -
冒泡排序以及如何优化冒泡排序
冒泡排序:冒泡排序的基本思想是:通过对待排序序列从前往后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的泡泡一样逐渐向上冒。测试八万个数组进行排序,使用优化后的代码大致需要20秒代码如下:public static void bubbleSort(int[] arr){ int temp=0; for (int i = 0; i < arr.length-1; i++) { for原创 2020-11-17 17:49:48 · 283 阅读 · 1 评论 -
利用递归回溯解决八皇后问题
八皇后问题:八皇后问题是这样一个问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法?即为每一行,每一列,每一斜线都不能有两个皇后。解决:我们可以利用一个一维数组解决此问题。定义一个长度为8的数组,因为要求每一行只能有一个,于是我们用数组的索引表示行,用索引对应的位置存储的元素代表皇后在列中的位置,通过递归回溯算法,得到全部92种情况下,皇后的位置public class EightQueen { //定义一个max表示工有多少皇后 int原创 2020-11-17 13:56:25 · 200 阅读 · 0 评论 -
二维数组模拟迷宫
二维数组模拟迷宫1.map表示地图2.i,j表示从地图上的哪个位置开始出发3.如果坐标能到map[8][8]位置,则说明道路能找到。public class mazeTest { public static void main(String[] args) { //定义一个二维数组模拟迷宫 int[][] map=new int[10][10]; //设置迷宫边界 for (int i = 0; i < 10; i++) {原创 2020-11-16 21:16:18 · 1006 阅读 · 0 评论 -
利用双向链表模拟栈的实现
思路:和利用数组模拟栈的实现本质是一样的。从而实现双向链表的先进后出。class Liststack{ private Listed head=new Listed(null,null,null); private int maxSize; public Liststack(int maxSize){ this.maxSize=maxSize; } private Listed temp=head; public boolean isFul原创 2020-11-16 01:45:07 · 196 阅读 · 0 评论 -
栈的介绍以及使用数组模拟栈
栈的介绍:1.栈的英文是(stack)2.栈是一个先进后出的有序列表3.栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底4.根据栈的定义可知,最先放入栈中元素在栈底,最后放入元素在栈顶,而删除元素刚好相反,最先放入的元素最后删除使用数组模拟栈:class ArrayStack{ private int maxSize;//栈的大小 private int[] stack;//数原创 2020-11-16 00:43:23 · 99 阅读 · 0 评论 -
利用单向环形链表处理约瑟夫问题(java)
问题:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列思路:利用单项链表循环遍历,直至人数不够继续游戏时停止。public class josepfuTest { public static void main(String[] args) { new PersonList().Josefu(41,原创 2020-11-15 21:33:43 · 60 阅读 · 0 评论 -
数组模拟环形队列
思路:1.front变量的含义做一个调整:front就指向队列的第一个元素也就是说,也就是说arr[front]就是队列的第一个元素2.rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置,因为希望空出一个空间作为约定。3.当队列满时,条件是(rear+1)%maxSize==front4.对队列为空的条件,rear==front空5.当我们这样分析,队列中的有效数据的个数(rear+maxSize-front)%maxSize6.我们就可以在原来的队列修改得到环形队列原创 2020-11-14 14:54:10 · 73 阅读 · 0 评论