数据结构和算法
匆忙拥挤repeat
倦鸟就此散 余花怎不乱 物是人已非 落寞
红尘难看破 美梦成真否 镜花水月尔 迷惘
展开
-
二维数组的两种遍历方式、左右旋转、左右逆序、上下逆序 (kotlin实现)
文章目录代码实现结论参考代码实现/** * desc: 二维数组 左右旋转,行内左右逆序。 上下逆序未实现。 * author: stone * email: aa86799@163.com * blog : https://stone.blog.csdn.net * time: 2020/2/29 10:25 */class ArrayTest { ...原创 2020-02-29 15:57:13 · 1273 阅读 · 0 评论 -
Java 递归、尾递归、非递归、栈 处理 三角数问题
import java.io.BufferedReader;import java.io.InputStreamReader;//1,3,6,10,15...n 三角数/* * # 1 * ## 1+2 * ### 1+2+3 * #### 1+2+3+4 * ##### 1+2+3+4+5 * ...第1层为1, 第n层等于 n + (f(n-1))原创 2015-07-01 17:47:52 · 1969 阅读 · 0 评论 -
Java 希尔排序
效率:O(n*logN)package sort;import utils.Util;/** * 希尔排序 * 以h为间隔,进行比较。 按一定公式,先求出最大的间隔h * 当h值大时,需要移动的元素个数就少,但移动的距离长。 内部以h步长的元素做插入排序 * 当h减小时,每趟排序需要移动的元素个数增多,但此时已接近于它们排序后的最终位置,这对于插入排序更有效率原创 2015-07-23 10:57:07 · 935 阅读 · 0 评论 -
递归与非递归 遍历文件目录
import java.io.File;import java.util.LinkedList;/* * 采用非递归方式遍历目录及其子目录的文件 */public class ProcessDirectory { public static int num;//文件总量 public static void main(String[] args) { String pa原创 2014-08-05 19:36:44 · 2888 阅读 · 4 评论 -
Java 递归解决 "只能两数相乘的计算器计算x^y" 问题
/** * 求一个数的乘方 * 求x^y,y是一个正整数。设计算器只能计算两数相乘,不能一次计算n个数相乘。 * 知:2^5=(2^2)^2*2; 2^6=(2^2)^3=((4)^2)*4; 2^8=(2^2)^4= (4^2)^2= 16^2 * 得到规律:x^y= (x^2)^(y/2),定义a=x^2,b=y/2, 则得到形如: x^y= a^b; * y如果是奇数原创 2015-07-02 15:29:00 · 1876 阅读 · 0 评论 -
Java 划分排序
划分:指定一个关键值key从左右两边进行循环划分操作,将小于等于key的放左边,大于等于key的放右边划分后的序列不一定全部有序O(N) 只有一趟排序/** * 划分 * * @author stone * @date 2015-7-29 下午4:37:16 */public class Partition { pub原创 2015-07-29 17:26:28 · 993 阅读 · 0 评论 -
Java CopyOnWriteArrayList 分析
java.util.concurrent.CopyOnWriteArrayList 是一个线程安全的List。内部维护了一个volatile Object[] elements,volatile修饰,表示即使在多线程环境中对它进行修改,每个线程都会实时拿到最新值add()时,会调用System.arrayCopy(),copy出一个新的array,再赋值给elements。要保证...原创 2016-03-23 11:09:32 · 964 阅读 · 0 评论 -
Java LinkedBlockingQueue 分析
package java.util.concurrentpublic class LinkedBlockingQueue extends AbstractQueue implements BlockingQueue, java.io.Serializable原创 2016-05-31 15:59:46 · 1645 阅读 · 0 评论 -
有序数列中,平衡选取一定数量的数
标题,不太好取… 其实就是选择的间隔step满足 总的数量/要选择的数量实际业务场景是:要求在超过150张图片中,平衡的选取150张图片,用于合成视频。为此写了以下 code :import java.util.Arrays;import java.math.*;class Untitled { public static void main(String[] args) ...原创 2018-05-10 18:08:34 · 345 阅读 · 0 评论 -
Java 实现双向且双端的链表,使用dummyHead、dummyTail、index
文章目录思路实现测试思路双向链表:next、prev 双向节点指针;使用 head、tail 表示双端;使用虚拟头、尾结点,方便循环遍历;使用 index,向用户提供类似数组一样的增、删、查(能查就能改,改没考虑);内部维护一个 size变量,表示实际节点的数量(不算虚拟头和尾);由 size、index,可以确定增、删、查是要从头还是从尾遍历实现://最近的节点: true 靠近...原创 2018-12-29 13:56:12 · 1278 阅读 · 0 评论 -
LeetCode No.203 删除链表中等于给定值 val 的所有节点 (Java)
问题:删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5-&原创 2018-12-26 10:35:35 · 474 阅读 · 0 评论 -
Java 实现冒泡排序及优化
//最差的冒泡 public void sort1(int[] ary) { long startTime = System.nanoTime(); for (int i = 0, len = ary.length; i < len; i++) { for (int j = 1; j < len; j++) { ...原创 2019-03-23 23:07:47 · 575 阅读 · 0 评论 -
Top K 问题的解法:使用快速排序、堆排序思想
什么是 Top K 问题求(随机的)数组中第 n 大的元素?求(随机的)数组中前 n 大的元素, 或者说 最大的 n 个元素?反之求第 n 小的,最小的 n 个元素,都可以说是 Top K 问题以下讨论的求 最大的情况 (即,顺序排序部分,是倒序的)快速排序解快排的思想:每次指定序列中的一个(比如是首位的)值,通过一次快排,返回的索引之前的值就是大于(或等于) 指定值的,之后的就...原创 2019-03-28 21:33:25 · 978 阅读 · 5 评论 -
Java 实现选择排序
文章目录选择排序介绍从前向后选择从后向前选择与冒泡排序的性能(时间消耗)比较选择排序介绍原理:每次选择外层循环当前的索引,接着内层循环中,通过判断,找到最小值或最大值的索引位置;再交换两个索引上的值。改进了冒泡排序,交换次数从O(N^2)减少到O(N), 而比较次数还是O(N^2) ,实际上交换次数最大就等于N-1次从前向后选择从前向后选择;每次内层循环找到最小值索引,交换到前面去...原创 2019-07-06 11:26:13 · 348 阅读 · 0 评论 -
Java 实现 二叉搜索树(一) 添加节点与广度优先遍历
文章目录什么是二叉搜索树定义树节点添加节点递归实现循环实现层级遍历(广度优先遍历)测试节点增加层级深度属性测试什么是二叉搜索树二叉搜索树(binary search tree),它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。每个节...原创 2019-07-07 11:49:07 · 483 阅读 · 0 评论 -
Java 递归解决 "汉诺塔" 问题
/** * 汉诺塔 问题 * 有塔A、B、C, 其中A中叠放了一些盘子,最下层的盘子最大,最上层的最小 * 要将A的盘子移动到C,且较大的盘子不能放在较小的盘子上 * * @author stone * @date 2015-6-29 下午9:56:53 */public class Hanoi { public static void main(String[] ar原创 2015-07-01 12:29:42 · 1410 阅读 · 0 评论 -
Java 模拟队列(一般队列、双端队列、优先级队列)
队列:先进先出,处理类似排队的问题,先排的,先处理,后排的等前面的处理完了,再处理对于插入和移除操作的时间复杂度都为O(1),从后面插入,从前面移除双向队列:即在队列两端都可以insert和remove:insertLeft、insertRight,removeLeft、removeRight含有栈和队列的功能,如去掉insertLeft、removeLef原创 2014-10-22 15:43:23 · 3937 阅读 · 0 评论 -
Java 递归、尾递归、非递归 处理阶乘问题
n!=n*(n-1)!import java.io.BufferedReader;import java.io.InputStreamReader;/** * n的阶乘,即n! (n*(n-1)*(n-2)*...1)。 * 0!为什么=1,因为1!=1*0!,所以0!=1 * * @author stone * @date 2015-1-6 下午18:48:00 *原创 2015-07-01 15:55:13 · 2910 阅读 · 0 评论 -
Java 实现单链表反序
//单链表反序public class SingleLinkedListReverse { public static void main(String[] args) { Node head = new Node(0); Node temp = null; Node cur = null; for (int i = 1; i <= 10; i++) { tem原创 2014-08-07 11:49:24 · 3122 阅读 · 0 评论 -
Java 实现有序链表
有序链表:按关键值排序。删除链头时,就删除最小(/最大)的值,插入时,搜索插入的位置。插入时需要比较O(N),平均O(N/2),删除最小(/最大)的在链头的数据时效率为O(1),如果一个应用需要频繁的存取(插入/查找/删除)最小(/最大)的数据项,那么有序链表是一个不错的选择优先级队列 可以使用有序链表来实现有序链表的插入排序:对一个无序数组,用有序链表来排序,比较的时间级原创 2014-10-25 13:45:58 · 5528 阅读 · 0 评论 -
Java 模拟单链表
线性表:线性表(亦作顺序表)是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。在实际应用中,线性表都是以栈、队列、字符串等特殊线性表的形式来使用的。线性结构的基本特征为:1.集合中必存在唯一的一个“第一元素”;2.集合中必存在唯一的一原创 2014-10-23 18:15:05 · 1779 阅读 · 0 评论 -
Java 模拟双端链表,以链表实现栈和队列
双端链表:双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用rear这样在链尾插入会变得非常容易,只需改变rear的next为新增的结点即可,而不需要循环搜索到最后一个节点所以有insertFirst、insertLast删除链头时,只需要改变引用指向即可;删除链尾时,需要将倒数第二个结点的next置空,而没有一个引用是指向它的,所以还是需要循环来读取操作原创 2014-10-24 15:17:32 · 1717 阅读 · 0 评论 -
Java 实现双向链表,基于双向链表实现双端队列
双向链表:就是有双向指针 即 双向的链域链结点的结构:┌────┬────┬────────┐│data│next│previous│└────┴────┴────────┘双向链表不必是双端链表(持有对最后一个链结点的引用),双端链表插入时是双向的有两条链:一条从头到尾,一条从尾到头,删除遍历时也是双向的/** * 双向链表 * * @author s原创 2014-10-26 00:29:49 · 6221 阅读 · 3 评论 -
Java 实现二分(折半)插入排序
设有一个序列a[0],a[1]...a[n];其中a[i-1]前是已经有序的,当插入时a[i]时,利用二分法搜索a[i]插入的位置效率:O(N^2),对于初始基本有序的序列,效率上不如直接插入排序;对于随机无序的序列,效率比直接插入排序要高/* * 二分(折半)插入排序 * 设有一个序列a[0],a[1]...a[n];其中a[i-1]前是已经有序的,当插入时a[i]时,利用二分法搜索原创 2014-10-17 12:31:25 · 5744 阅读 · 0 评论 -
Java 实现双向冒泡排序
冒泡排序_鸡尾酒排序就是双向冒泡排序此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序,外层比较左右边界l内层一个循环从左向右比,取高值置后;一个循环从右向左,取低值置前;效率上,O(N^2), 不比普通的冒泡快public class Bubble_CocktailSort { public static void main(String[] args) {原创 2014-10-20 12:02:46 · 3852 阅读 · 2 评论 -
用数组模拟 优先级队列
package datastruct;import java.util.Arrays;import java.util.Comparator;/** * 用数组模拟 优先级队列 优先级高的排前、先出 线性表结构 * 类似使用了比较器的 TreeSet、TreeMap * @author stone * 2014-07-30 09:29:12 */public class S原创 2014-07-30 18:07:44 · 993 阅读 · 0 评论 -
Java 实现二分法查找
二分法查找,需要数组内是一个有原创 2014-10-15 17:28:53 · 1090 阅读 · 0 评论 -
Java 实现 插入排序
插入排序:稳定的排序算法比较的元素从前两个开始,然后前三个,直至N比较的方向为从后向前比较, 满足比较条件则:把前一个赋值给后一个, 一轮比较下来,把右边界值赋给左边第1个不满足条件的位置上比较的次数为1,2,3...N-1, 总共(N^2-N);赋值的次数跟比较次数差不多,可能略大于, 但是单向赋值比交换(双向赋值)肯定要快一点效率:虽然还是O(N^2), 但对于部分有序的数原创 2014-10-16 18:35:36 · 1124 阅读 · 0 评论 -
Java 实现奇偶排序
奇偶排序:第一轮扫描选择所有的奇数据项对,与相邻偶数比较,a[j]和a[j+1],j是奇数(j=1,3,5...), j第二轮扫描选择所有的偶数据项对,与相邻奇数比较,a[j]和a[j+1],j是偶数(j=0,2,4...), j奇偶排序的时间复杂度为O(N^2)/** * 奇偶排序 * @author stone * */public class OddEvenSor原创 2014-10-20 16:03:21 · 3221 阅读 · 2 评论 -
Java 归并排序
/** * 归并排序 O(N*logN) * 把一个数组分成两半,排序每一半,然后将两个有序的数组,用merge()归并成一个完整的有序数组 * * 利用递归,将数组递归拆分: size/2 再 /2 再 /2 .... * * @author stone * */public class MergeSort { public static void main(S原创 2015-07-01 12:40:43 · 824 阅读 · 0 评论 -
Java 模拟栈结构
栈和队列:一般是作为程序员的工具,用于辅助构思算法,生命周期较短,运行时才被创建访问受限,在特定时刻,只有一个数据可被读取或删除是一种抽象的结构,内部的实现机制,对用户不可见,比如用数组、链表来实现栈栈:同时,只允许一个数据被访问,后进先出例1,使用数组作为栈的存储结构public class StackS { private int ma原创 2014-10-21 15:51:50 · 2917 阅读 · 0 评论