排序算法
守护砂之国泰裤辣
既然已经走这么远了,那么不妨再走远一点...
展开
-
排序算法_插入排序
我们斗地主或者打麻将的时候,每轮开始时会起牌(也叫抓牌)。然后将抓到的牌插入到手中的牌中使其有序。这个插入的过程就和插入排序很类似。这篇博客就简单介绍一下插入排序。给定一组序列,我们要将其升序排序,如:1.假设我们第一次抓牌时,0号位置,抓到56,那么它就是有序的。2.我们从第二次抓牌开始,来到1号位置,抓到25,它小于56,所以我们要将其插入到56前面。3.第三次抓牌,来到2号位置,“牌面值”为...原创 2018-02-13 17:21:49 · 131 阅读 · 0 评论 -
排序算法_桶排序
这是一个特别有趣的排序算法,它的排序复杂度是居然是线性的,可以达到O(n)。当然,它需要额外的数组,也就是一排“桶”来计数,桶的数量与最大元素有关。还有一个缺点,它适用场景比较局限。 我们举个栗子,假如大学里一个计算机专业班的数据结构成绩(满分100分,最低0分)出来了,想到这个莫名感伤,假如这个班有6个人(先假设一下,几百个人也是同样的处理方法),它们的成绩是30,93, 71, ...原创 2018-02-22 09:50:17 · 185 阅读 · 0 评论 -
排序算法_快速排序
尽管有前面复杂度较好的归并排序,但当今大多数排序程序都是基于快速排序算法。它是英国计算机科学家C.A.R.(Tony) Hoare发明的。 wikipeda上的gif图描述快排: 和前面归并排序一样,快速排序也采用了分而治之的策略,不过它在拆的时候就让序列“稍微有序”,越拆越有序,最后就不用像归并一样重建数组了。 如何做到稍微有序呢?就是让偏大的元素尽量靠近序列末尾,较小的...原创 2018-02-22 12:03:49 · 302 阅读 · 0 评论 -
排序算法_归并排序
归并排序算是分而制之策略里的典型算法之一。 先来看看wikipeda上的gif图: 它的提出,是为了改进前面冒泡和选择排序存在的问题,对于后两种排序,随着问题规模的翻倍,其运行时间会增长到4倍。如果我们反过来思考,将问题的规模减小一半,那么运行时间就是原来的四分之一。有了这个事实,将数组拆散再按序合并的这种应用递归的分而治之的归并排序就有了理论依据。 考虑到下列一组序列:...原创 2018-02-22 10:33:23 · 351 阅读 · 0 评论 -
排序算法_冒泡排序
我们将讨论一系列排序算法。第一个算法是冒泡排序。冒泡,顾名思义就是将轻的气体从水中浮出,反过来就是沉底。而冒泡排序的思想就是每次从当前序列中两两元素比较并且必要时交互两个元素的位置来实现将当前序列中最大或最小的元素“浮”到序列末端。wikipeda上的gif图:假如我们要排序的整数序列为:一开始我们比较该序列的前两个元素,假如我们是按升序排列:我们发现56>25,我们就交互这两个元素:交换完...原创 2018-02-12 21:26:31 · 301 阅读 · 0 评论 -
排序算法_选择排序
之前我们讨论过冒泡排序,这次我们来接触一下选择排序。选择排序就是要(假如我们是升序排序)每次选择出剩下序列中最小的元素放到当前序列的首位置。前面我们学的冒泡排序,那个是两个邻居元素相互比较,把最大的元素依次‘推’到序列的末端;而选择排序就是通过“打擂”的思想找出最小或最大的元素后,将其与序列首部或尾部交换来达成排序的目的的。wikipeda上的动态图:假如我们要排序的序列为:我们要从当前序列中找到...原创 2018-02-12 23:10:27 · 184 阅读 · 0 评论 -
排序算法_希尔排序
希尔(Shell)排序可以看作一种插入排序,不过它是对插入排序的改进,它的核心在于“递减增量”。当这个“增量”减到1的时候,也就是最后一趟大排序的时候,Shell排序也就等于插入排序了。public class ShellSort { public static void shellSort(int A[]) { int array_size = A.lengt...原创 2018-06-03 23:19:34 · 141 阅读 · 0 评论 -
排序算法_堆排序
堆排序算是比较复杂的一种排序算法,但是它的时间复杂度为O(nlogn),这个复杂度和归并排序一样,但是后者需要一个临时的数组,而堆排序就不需要。 首先我们要构造一个二叉堆(使用数组来模拟完全二叉树): import java.util.ArrayList;public class Heap<E extends Comparable<E>> { priv...原创 2018-06-03 23:28:48 · 164 阅读 · 0 评论