排序算法
长弓Smile
这个作者很懒,什么都没留下…
展开
-
快速排序
快速排序采用了分治的思想。 分解: 数组A[p,r]被划分为两个(可能为空的子数组A[p,q-1])和A[q+1,r],使得A[p,q-1]的每个元素都小于等于A[q],而A[q]也小于等于A[q+1,r]中的每个元素,其中,计算下标q也是划分过程的一部分。 解决: 通过递归调用快速排序,对子数组A[p,q-1]和A[q+1,r]进行排序。 合并:因为子数组都是原址排序,所以不需要合并,数组A原创 2017-09-13 21:40:46 · 177 阅读 · 0 评论 -
希尔排序
之前一直只了解希尔排序的过程,没具体写过代码,今天补上。 基本思路: 1.选定步长gap,比较元素a[i]和a[i+gap]的大小,并调整顺序,逐步调整gap值,直到gap值为1 2.我一般采用初始gap为length/2,,然后逐步递减public class ShellSort { private static int N = 15; static Random r...原创 2018-04-07 22:31:41 · 136 阅读 · 0 评论 -
堆排序 (包括升序和降序,Arraylist 实现)
补充上一篇 利用Arraylist实现的堆排序(包含升序和降序)原创 2017-09-12 16:58:52 · 1264 阅读 · 0 评论 -
堆排序
堆排序二叉堆是一个数组,可以将其看成是一个近似的完全二叉树最大堆 父节点>=子节点 根节点最大 最小堆 父节点<=子节点 根节点最小原创 2017-09-12 16:23:09 · 254 阅读 · 0 评论 -
归并排序
归并排序 过程: 1. 分解 分解待排序的n个元素的序列 成各具n/2个元素的两个子序列 2. 解决 使用归并排序递归地排序两个子序列 3. 合并 合并两个已排序的子序列以产生已排序的答案原创 2017-09-11 14:25:55 · 218 阅读 · 0 评论 -
插入排序
插入排序 Java实现原创 2017-09-11 10:08:22 · 220 阅读 · 0 评论 -
冒泡排序
冒泡排序 原理 冒泡排序算法的运作如下:(从后往前) 1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3. 针对所有的元素重复以上的步骤,除了最后一个。 4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。原创 2017-09-19 08:58:08 · 385 阅读 · 0 评论 -
几种常见的算法比较
排序算法总结:时间复杂度:-平方阶O(n2)的排序:各类简单排序、直接插入、直接选择、冒泡排序 - 线性对数O(nlg2n)排序:快速排序、堆排序和归并排序 - O(n1+)排序:)排序:为介于0-1之间的常数:希尔排序 - 线性O(n)排序:基数排序、桶排序、箱排序转载 2017-09-14 15:36:38 · 669 阅读 · 0 评论 -
计数排序
计数排序: 假设n个输入元素中的每一个都是在0~区间内的一个整数,其中k为某个整数。当k=O(n)是,排序时间为O(n). 基本思想:对每个输入元素x,确定小于x元素的个数。利用这一信息,可以直接把x放到输出数组的位置上。例如,有17个元素小于x,则x就应该在第18个输出位置上。原创 2017-09-14 09:12:05 · 186 阅读 · 0 评论 -
快速排序2
这个排序方法跟算法导论上不一样。 取第一个元素为基准。定义两个指针,一个从前往后扫描,一个从后往前扫描。 ①. i = L; j = R; 将基准数挖出形成第一个坑a[i]。 ②.j–,由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。 ③.i++,由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。 ④.再重复执行②,③二步,直到i==j,将基准数填入a[i]中。...原创 2018-03-29 16:28:37 · 189 阅读 · 0 评论