摘要:
1.介绍 基数排序是一种非比较型整数排序算法, 其原理是将整数按位数切割成不同的数字, 然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期) 和特定格式的浮点数,所以基数排序也不是只能使用于整数。 2.基数排序 vs 计数排序 vs 桶排序 基数排序有两种方法: 这三种排序算法都利用了 阅读全文
摘要:
1.介绍 桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 为了使桶排序更加高效,我们需要做到这两点: 在额外空间充足的情况下,尽量增大桶的数量 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中 同时,对于桶中元素的排序,选择何种比较排序算法对 阅读全文
摘要:
1.介绍 计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 第一点:计数排序的特征 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。 计数排序不是比较排序,排序的速度 阅读全文
摘要:
1.介绍 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。 堆积是一个近似完全二叉树的结构,并同时满足堆积的性质: 即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序可以说是一种利用堆的概念来排序的选择排序。 分为两种方法: 大顶堆:每个节点的值都大于或等于其子节点的 阅读全文
摘要:
1.介绍 快速排序是由东尼·霍尔所发展的一种排序算法。 在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。 在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。 事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快, 因为它的内部循环(inner loop)可以在大部分的架构 阅读全文
摘要:
1.介绍 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。 该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法: 第一种:自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 阅读全文
摘要:
1.介绍 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。 但希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的: 改进一:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 改进二:但插入排序一般来说是低效的,因为插入排序每次只 阅读全文
摘要:
1.介绍 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴, 但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列, 对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序和冒泡排序一样 阅读全文
摘要:
1.介绍 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。 所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。 2.算法的步骤 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素 阅读全文
摘要:
1.概述 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端 阅读全文
摘要:
1.介绍 排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序, 而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 2.常见的内部排序 插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、 阅读全文
摘要:
1.介绍 双重检查锁定模式(也被称为"双重检查加锁优化","锁暗示"(Lock hint)) 是一种软件设计模式用来减少并发系统中竞争和同步的开销。 有时候会在单例模式里遇到这个双重检查锁定,这个技术是单例模式的一种具体的实现, 通过它来进行单例模式里的延迟初始化,保证在经过延迟初始化之后还是只有一 阅读全文
摘要:
1.介紹 线程池本身提供了大量数据统计相关的方法、扩容方法、预创建方法等等。 2.核心线程相关 getCorePoolSize():获取核心线程数。 setCorePoolSize():重新设置线程池的核心线程数。 prestartCoreThread():预启动一个核心线程,当且仅当工作线程数量小 阅读全文
摘要:
1.方法 reject(Runnable command)方法很简单: final void reject(Runnable command) { handler.rejectedExecution(command, this); } 调用线程池持有的成员RejectedExecutionHandl 阅读全文
摘要:
1.主要的变量 private final ReentrantLock mainLock = new ReentrantLock(); private final Condition termination = mainLock.newCondition(); 2.ThreadPoolExecuto 阅读全文