2013-11-21 veryyoung
【数据结构类】实现一个对链表排序的算法,C`C++可以使用std∶∶list Java使用LinkedList 要求先描述算法,然后再实现,算法效率尽可能高效。 基本思想: 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 算法过程 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小 继续阅读 »
2014-01-14 W.Y.
算法原理 先上一张堆排序动画演示图片: 1. 不得不说说二叉树 要了解堆首先得了解一下二叉树,在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 二叉树的每个结点至多只有二棵子树(不存在度大于 2 的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第 i 层至多有 2i - 1 个结点;深度为 k 的二叉树至多有 2k - 1 个结点;对任何一棵二叉树 T,如果其终端结点数为 n0,度为 2 的结点数为 n2,则n0 = n2 + 1。 树和二叉树的三个主要差别: - 树的结 继续阅读 »
2017-06-06 LEo
冒泡排序,顾名思义就是像冒泡一样进行排序,那么是怎么个冒泡法呢? 举个例子说明一下,比如有一个数组:[3 2 1 0],需要将该数组进行升序排序,即排序成:[0 1 2 3]。 冒泡排序是这样进行排序的,首先将第一个元素和第二个元素进行比较,如果第一个元素比第二个元素大,那么将这两个元素交换位置,比如这里的第一个元素是3,第二个元素是2,那么第一次排序后,数组变成:[2 3 1 0],3往后移动了一位,然后重复刚刚的步骤,将第二个元素和第三也进行比较,数组变成:[2 1 3 0],再将第三个元素和最后一个元素重复之前的比较,数组变成:[2 1 0 3]。 继续阅读 »
2016-09-04 craneyuan
在了解堆排序之前,我们有必要清楚“什么是堆呢?”。 堆(英语:Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。 堆的逻辑定义: 堆的实现通过构造二叉堆(英语:binary heap),实为二叉树的一种;由于其应用的普遍性,当不加限定时,均指该数据结构的这种实现。这种数据结构具有以下性质。 任意节点小于(或大于)它的所有后裔,最小元(或最大元)在堆的根上(堆序性)。 堆总是一棵完全树。即 继续阅读 »
2015-08-17 veryyoung
今天遇到一个需求,需要对计算过后的结果进行排序,结果出现了类似 1 10 11 12 13 14 15 16 17 18 19 2 3 4 5 6 7 8 9 这样的排序结果 很显然,mysql把它当字符串去排序了。 解决方案 使用CAST把字符串转为数字再排序 SELECT * FROM table_name ORDER BY CAST(field_name AS UNSIGNED) 将字段*1或者+0可以将MySQL字符串字段按数值排序 SELECT * FROM table_name ORDER BY field_name*1 desc 或者 SELECT * FROM table_name ORDER BY 继续阅读 »
2016-08-15 craneyuan
前言 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。 TreeMap 基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 HashMap HashMap的值是没有顺序的,它是按照key的HashCode来实现的,对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMap的value排序。 Map.Entry返回Collections视图。 按key排序 TreeMap默认是升序的 继续阅读 »
2016-07-05 jude
这是一个基础算法系列,主题是:为什么知道原理还是写不出正确的程序呢? 第一篇已经写好,叫做我尝试去写快排,结果。。。。文章结构都差不多:原理、联想、用法、框架、分步实现、完整代码及测试用例。 原理 插入排序的原理是: - 将集合分为两个部分:已排好的部分和待排序的部分 - 每次从待排序部分抽一个元素跟已排好部分中的元素逐一比较,直到找到合适的位置,插入待排序元素 - 合适的位置可以是第一个比待排序元素小(大)的,也可能是已排好部分的下界 继续阅读 »
2013-11-14 veryyoung
public class ArrayOperation { /** 归并排序,ints为要进行排序的数组,temp为临时数组,start为排序起点,end为排序终点,排序范围为[start,end] */ private static void guibingSort(int[] ints, int[] temp, int start, int end) { if(start >= end) return; int middle = (start + end) / 2;//中间点 int left = start;//左边起点 继续阅读 »
2016-07-29 jude
原理 将待排序元素分为前后两部分,分别调用归并排序使它们有序 从头开始逐个比较前后两部分的元素,根据比较结果先后放进新数组,最终返回这个新数组 联想 归并排序用到了递归,递归终止的条件是待排序元素数量小于 2 归并排序比较之后不会交换元素,而是生成新的数组 继续阅读 »
2016-03-30 craneyuan
位图排序简介 位图排序的直接思路是想通过有限位数(比如1位)去映射一个整数,从而节省存储空间,而间接带来的好处是给指定数据集合排序了。 实际案例介绍 本案例摘抄自《编程珠玑》一书。 输入: 所输入的是一个文件,至多包含n个正整数,每个正整数都要小于n,这里n=10^7。如果输入时某一个整数出现了两次,就会产生一个致命的错误。这些整数与其他任何数据都不关联。 输出: 以非递减形式输出经过排序的整数列表。 约束: 至多(大概)只要1MB的可用主存;但是可用磁盘空间非常充足。运行时间至多只允许几分钟;10分钟是最适宜的运行时间。 代码实现如下 more ``` java include include in 继续阅读 »