算法
介绍常用的算法
子翊寒
放开,请让我带你入门
展开
-
10. 排序算法思想概述及总结(精华)
排序算法的常用种类初级排序选择排序插入排序希尔排序进阶排序快速排序归并排序(二叉堆排序)堆排序非比较排序计数排序基数排序桶排序逆序对逆序对,是分析排序算法的一个重要知识点。既然评估排序算法,就要知道如何去描述数组的排序程序。逆序对,数组中两个逆序元素的对数。比如【1, 5, 3】,其中(5, 3)就是逆序的,所以这个数组的逆序对为1。那么...原创 2020-03-20 15:53:23 · 428 阅读 · 0 评论 -
9. 桶排序
思想桶排序,也是为了解决计数排序计数数组大小设置的问题。桶排序,就是把待排序数据分为不同的区间,然后区间内进行排序,最后即可完成排序。就有点像,成绩会有一个区间,比如100-90, 90-80这样,每个区间就是一个桶,然后对桶内元素进行排序。最后取出来,即完成排序。从上面分析可以看出,我们对区间排序的时候,最好每个区间(桶)中数据是均匀的。至于如何对桶内元素进行排序?这个是一个困惑,网上很...原创 2020-03-20 15:38:27 · 171 阅读 · 0 评论 -
8. 基数排序
思想基数排序,是按照元素的更小元素组成来进行排序。拿常用的数字排序举例,会先对个位进行排序,然后对十位进行排序。其中,关键是如何对个位进行排序,如何对十位进行排序。我们知道对于数字的每一位,只有10个数字(0-9),这就是基数。所以故名,基数排序。基数排序所以可以理解为适用于基数是有限的情况下。所以基数排序中的基数,相当于把计数排序中的计数数组的大小确定下来了。那么如何对个位、十位进行排...原创 2020-03-20 15:12:26 · 169 阅读 · 0 评论 -
7. 计数排序
思想计数排序,不再依赖元素的比较,而是通过计数的方式,来进行排序。比如,你知道成绩比你高的有5个人,那么你是多少名呢?计数排序就是采用这种思想。计数排序,为每一个元素设置一个计数,然后进行计数排序。从这个思想上来看,计数排序会使用到复制的空间,而且辅助空间的数量为 待排序数组的最大值-最小值+1。从这个分析上,可以知道计数排序适用于 小范围的排序,就是说待排序的数组,最大小值的差值不能太...原创 2020-03-20 14:52:02 · 92 阅读 · 0 评论 -
6. 快速排序
思想快速排序,是选取一个元素,然后经过交换元素,保证选定元素的左边都小于它,右边元素都大于它。每次操作后,选定元素的位置就是排序后的位置。就像多个人进行高矮个排列一样,你看了下,前面的人都比你矮,后面的人都比你高,那么你就可以不动了,随他们怎么折腾,反正你站的位置对了,他们排序好了,你也还是站在这个位置。实现import java.util.Arrays;public class Qu...原创 2020-03-20 00:03:07 · 134 阅读 · 0 评论 -
5. 堆排序
思想维护一种数据结构,它可以完成下面两个功能:插入数据;取出最小数据。因为数组和链表均不能均衡这两个功能的时间复杂度。于是采用完全二叉树来实现这两种功能。小堆,每个节点值都小于其子节点的值。其实,就有点像排行榜的感觉,当有新的元素登上排行榜的时候,将会去除最后一名的元素,新加入的元素存储在相应的位置。只不过这个排行榜是用二叉树堆实现的,这个二叉树堆也不想二叉搜索树那样完全有序。其只要求父...原创 2020-03-19 22:54:35 · 130 阅读 · 0 评论 -
4. 归并排序
思想归并排序,是很有趣的算法,也是我了解的分治算法的启蒙算法。它就是将一个数组,分为两个数组,然后两个数组,继续往下分,指导每个数组子数组有两个元素,这个时候就很容易比较。然后再将其解进行合并。可以这样想,你手上有一堆牌,然后你的手太小了,没法排序,于是你把它按照两个一组放在桌子上。然后你对一组中的两张牌进行排序,然后都排序完后,再对组进行合并。实现import java.util.Arr...原创 2020-03-19 22:34:26 · 73 阅读 · 0 评论 -
3. 希尔算法
思想希尔算法,是间隔对数组抽样,从而形成多个子数组。在这多个子数组中,保证其排序正确性。然后对抽样间隔逐渐变小,再次保证其排序。对于这些抽样出来的子数组,应该如何排序呢?这里用到插入排序。(选择排序因为需要每次遍历,所以对于部分排序的数组,比较浪费时间)希尔排序的间隔选取也是有讲究的。实现import java.util.Arrays;public class ShellSort ...原创 2020-03-19 22:04:48 · 135 阅读 · 0 评论 -
2. 插入排序
思想将数组分为排序和未排序两部分,每次从未排序部分选取一个元素,按顺序插入到已排序部分。想象你打牌的时候,手上拿的是已排序的拍,每次抓牌的时候,都是把抓到的牌(未排序)按顺序插入到手上已排序的牌中。插入的策略,交换相邻元素或者移动插入。每进行一个相邻交换,逆序对减一。实现import java.util.Arrays;public class InsertSort { pub...原创 2020-03-19 21:07:04 · 123 阅读 · 0 评论 -
1. 选择排序
思想每次选择未排序元素中的最小值,将其放在最左边。想象你打牌的时候,如果你手上有一堆牌,你每次找到最小的牌,然后将其出出来。手上的是未排序的牌,出出去的牌按顺序摆出来,就是已排序的。比较耗时:第一次比较n,第二次比较n-1,以此类推插入耗时:插入策略分为,移动选定元素前的元素,然后插入最小值;或者不断交换相邻元素,直到最小值到达所在位置;或者找到最小元素后,直接与需要排序的位置进行交换前...原创 2020-03-19 20:40:40 · 99 阅读 · 0 评论