![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 59
X S
这个作者很懒,什么都没留下…
展开
-
从2-3查找树到红黑树
2-3查找树为了保证查找树的平衡性,我们需要一些灵活性,因此在这里我们允许树中的一个结点保存多个键。2-结点:含有一个键(及其对应的值)和两条链接,左链接指向的2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。3-结点:含有两个键(及值对应的值)和三条链接,左链接指向的2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的两个键之间,右链接指向的2-3树中的键都大于该结点。示意图:...原创 2021-01-26 15:04:24 · 106 阅读 · 0 评论 -
冒泡排序&选择排序
冒泡排序1.思路:冒泡排序只会操作相邻的两个数据。每次冒泡排序都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩交换。2.图解:对数组[4, 5, 6, 3, 2, 1]进行冒泡排序,每次冒泡操作的详细过程如下图所示:从图中可以看出只需要array.length-1次冒泡,数组就可以排列好。3.代码实现public void bubbleSort(int[] arr) { if (arr == null || arr.length < 2) re原创 2021-01-10 17:45:03 · 183 阅读 · 1 评论 -
基数排序
// 基数排序public class RadioSort { public static void radioSort(int[] arr) { if (arr == null || arr.length < 2) return; int n = arr.length; // 找最大值 int max = arr[0]; for (int i = 1; i < n; i++) {原创 2021-01-10 17:37:05 · 100 阅读 · 0 评论 -
桶排序
定义桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。思路将要排序的数据分到几个有序的桶中,每个桶里的数据在单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出来,组成的序列就是有序的了。对数组[5, 25, 34, 12, 4, 9, 18, 26, 22, 24, 36, 48, 0, 46, 50]进行桶排序:原创 2020-12-15 17:54:08 · 109 阅读 · 0 评论 -
平衡二叉树—AVL树
在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。特点AVL树本质上还是一颗二叉查找树,具有以下特点:是一颗二叉查找树每个节点的左右子树的高度之差的绝对值(平衡因子)最多为1。下图就是一个AVL树,每个节点旁边标注的是平衡因子:其中节点4的左子树高度为0,右子树不存在,所以平衡因子是0 - (-1) = 1;所有的叶子节点不存在左右子树,所以平衡因子是0。原创 2020-12-11 20:00:12 · 167 阅读 · 0 评论 -
计数排序
计数排序是一种适合于对数组中最大值与最小值相差不大的数组进行排序。假设对数组 [1, 0, 5, 6, 4, 7, 4, 2, 8, 9, 0, 1, 4, 2, 0, 3, 5, 7, 8, 6] 进行计数排序。我们可以创建一个临时数组a[max+1],临时数组的大小为10,临时数组的下标正好与原数组中的数据对应。我们可以遍历原数组,每遍历一个数,对应临时数组的下标元素就加一。比如无序数组的第一个数是1,那么临时数组下标为1的元素就加一:第二个数是0,那么临时数组下标为0的元素加一:直到未排序原创 2020-12-10 23:10:31 · 84 阅读 · 0 评论 -
二叉搜索树及二叉树的前中后序遍历(递归和非递归)
定义二叉查找树(Binary Search Tree)又称二叉排序树、二叉搜索树。二叉查找树是为了实现快速查找而生的。不过,它不仅仅支持快速查找一个数据,还支持快速插入、删除一个数据。二叉查找树要求,在树中的任意一个节点都要满足,其左子树中每个节点的值,都要小于这个节点的值,而右子树每个节点的值都大于这个节点的值。这两个都是二叉查找树。查找在二叉查找树中查找一个节点,我们先取根节点,如果它等于我们要查找的数据,那就返回。如果要查找的数据比根节点的值小,那就左子树中递归查找;如果要查找的数据比根节点原创 2020-12-08 21:50:27 · 550 阅读 · 0 评论 -
二叉堆与堆排序(详细图解)
二叉堆二叉堆是一种特殊的树,有两种特性:堆是一个完全二叉树二叉堆中任意一个父节点的值都大于等于(或小于等于)其左右孩子节点的值。根据第二条特性,可以将二叉堆分为两类:最大堆:父节点的值总是大于或等于左右孩子节点的值。最小堆:父节点的值总是小于或等于左右孩子节点的值。二叉堆的实现1.往堆中插入一个节点由于二叉堆具有完全二叉树的特性,所以我们插入节点时,应该保证它任然是一个完全二叉树。所以,在插入的时候,我们把新节点插入二叉堆的最后一个位置。例如,在下图中插入7。然后在原创 2020-12-01 23:25:14 · 1912 阅读 · 0 评论 -
快速排序
快速排序原理从数组中任意选取一个元素,将这个元素称为中轴元素,然后我们将大于中轴元素的元素放在其右边,小于中轴元素的元素放在其左边,然后将中轴元素左边和右边分为两个小的数组,重复此过程,直到数组的大小为1,此时每个元素都处于有序的位置。将第一个元素设置为中轴元素,第二个元素设为i,最后一个元素设为j。然后让i和j从数组的两边向中间扫描。i向右遍历的过程中,如果遇到大于中轴元素的元素则停止移动,j向左遍历的过程中,如果遇到小于中轴元素的元素则停止移动(移动过程中需满足i <= j,不满足则停止移动)原创 2020-11-29 00:02:25 · 312 阅读 · 0 评论 -
希尔排序
1.思路希尔排序可以说是插入排序的变种或者说是插入排序的优化,对于插入排序来说,如果一个元素离它的正确位置距离越远,需要移动的次数就越多,这样速度就比较慢。而希尔排序的思想就是先让数组进行分组,再进行插入排序。对一个数组大小为h的数组,刚开始分成h/2个数组进行插入排序,每个数组的元素间距为h/2,接着分成h/4个数组进行插入排序,元素间距为h/4,直到分组后的数组只有一个,就是最后一次插入排序。这种分组插入排序的方式可以优化元素离正确位置较远而消耗时间过长的情况。2.图解对数组[8, 9, 1, 7原创 2020-11-21 22:25:43 · 103 阅读 · 0 评论 -
归并排序
1.思路将数组从中间分成前后两个数组,然后继续将前后两个数组从中间划分为更小的数组,直到分成每个数组只有一个元素,此时相当于每个数组都是有序数组,在将两个大小为1的数组合并成一个大小为2的,在把大小为2的数组合并成4的…直到全部小的数组合并起来。所以归并排序的代码其实就是一个分解数组的方法加上一个合并两个有序数组的方法。2.图解3.代码实现public int[] mergeSort(int[] arr, int left, int right) { // 如果left == ri原创 2020-11-23 23:04:15 · 79 阅读 · 0 评论 -
插入排序
1.思路:我们可以先思考一个问题,怎样往一个有序数组中添加一个元素并且保证这个有序数组依然有序。解决这个问题很简单,只需要遍历数组找到应该插入的位置即可。插入排序就是这种思想。我们可以将数组分为已排序区间和未排序区间,初始时已排序区间只有一个元素,可以视为一个有序数组。每次拿出未排序区间的第一个元素插入已排序区间,重复这个过程直到未排序区间为空,插入排序结束。2.图解:对数组[4,5,6,1,3,2]进行插入排序,步骤如下图:3.代码实现:public void insertSort (int[]原创 2020-11-20 22:32:15 · 148 阅读 · 2 评论