
数据结构与算法
爱上香锅的麻辣
高级Java开发工程师,熟悉电商系统整体架构(尤其是订单和商品系统)和服务治理体系
展开
-
交换排序——冒泡排序
一.基本思想在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 /** * 冒泡排序 * @param array */ public void bubbleSort(int[] array){转载 2015-10-14 21:10:40 · 446 阅读 · 0 评论 -
Java递归算法实例
递归(recursion):程序调用自身的编程技巧。递归满足2个条件:有反复执行的过程(调用自身)有跳出反复执行过程的条件(递归出口)转载 2016-03-10 22:29:46 · 1262 阅读 · 0 评论 -
分治算法实例
1、求x的n次幂public long power(int x,int n){ long result; if(n==1){ return x; }else{ if(n%2==0){ result = power(x,n/2)*power(x,n/2);原创 2016-12-07 09:36:08 · 1021 阅读 · 0 评论 -
B树、B+树的java实现
(1)树中每个结点至多有m棵子树。【解释:因为树的阶是m,所有这个是必然】(2)若根结点不是叶子节点,则至少有两棵子树。(3)除根结点之外的所有非叶子结点至少有⌈m/2⌉棵子树。【解释:第一条是用来限制所有节点度的最大值,2、3两条是用来限制根结点和非叶子结点度的最小值】(4)所有的非叶子结点中包含下列信息数据(n,P0,K0,P1,K1,P2,···,Kn-1,Pn)原创 2017-10-28 16:36:58 · 7317 阅读 · 2 评论 -
反转排序
反转排序就是以相反的顺序把原有的数组的内容重新排序。 public void reverseSort(int[] arr){ int len =arr.length; int temp; for(int i=0;i<len/2;i++){ temp=arr[i]; arr[i]=arr[len-i-1]; arr[len-i-1]=temp; }}转载 2016-03-02 13:34:21 · 640 阅读 · 0 评论 -
1.Java数据结构原理解析-Map系列
一、Map家族特点收集 集合 有序性 安全性 速度 是否支持null fail-fast还是fail-safe HashMap 无序 线程不安全 快 key/value可为null fail-fast LinkedHashMap 插入/访问顺序 线程不安全 快 key/value可为null fail-fas...原创 2017-11-19 12:30:46 · 623 阅读 · 0 评论 -
3.Java数据结构原理解析-Queue系列
Queue,也就是队列,满足FIFO的特性。 在Java中,Queue是一个接口,它的实现类有很多,其中非线程安全的代表是LinkedList,线程安全的有阻塞和非阻塞的,阻塞的大都实现了Queue的子接口BlockingQueue(阻塞队列),例如:ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、DelayQueue等。原创 2017-11-28 09:21:51 · 2597 阅读 · 0 评论 -
2.Java数据结构原理解析-List系列
一、List家族特点 集合 效率 线程安全性 ArrayList 读取快,插入慢 线程不安全 LinkedList 插入快,读取慢 线程不安全 Vector 慢 线程安全 CopyOnWriteArrayList 读取快,插入慢 线程安全二、ArrayListJava中的数组初始化后,长度就是不...原创 2017-11-21 22:23:39 · 394 阅读 · 0 评论 -
4.Java数据结构原理解析-Set系列
一.Set家族特点 Set 效率 有序性 HashSet 读取快,插入慢 无序 LinkedHashSet 插入快,读取慢 会保存插入的顺序 TreeSet 插入快,读取慢 自定义排序规则二.HashSet实现原理 我们都知道,Set与List的主要区别在于Set中的元素是不允许重复的,正好Map的key是不...原创 2018-03-09 19:56:35 · 503 阅读 · 0 评论 -
一致性哈希算法与java实现
一、一致性哈希算法的概念一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。 因此,引入了一致性哈希算法: 把转载 2015-10-30 10:42:19 · 753 阅读 · 0 评论 -
Java实现先来先服务与短作业优先
1、定义作业类package com.ghs.job;public class Job { /**作业编号*/ private String jobId; /**运行时间*/ private int runTime; public Job() { super(); } public Job(String jobId, int ru原创 2015-10-25 16:19:02 · 2698 阅读 · 0 评论 -
单链表的Java实现
public class SingleLinkList { /**头指针*/ private Node header = null; public SingleLinkList() { super(); if(header == null){ header = new Node(); header.s原创 2015-10-20 23:32:36 · 520 阅读 · 0 评论 -
归并排序
一.基本思想归并(Merge)排序法是将待排序序列分为若干个子序列,对每个子序列进行排序,然后再把有序子序列合并为整体有序序列。二.归并排序示例三.归并排序的Java实现 /** * 归并排序 * @param array */ public static void mergeSort(int[] array){ sort(array,0,原创 2015-10-14 23:02:24 · 412 阅读 · 0 评论 -
基数排序
一.基本思想利用多关键字的划分,逐渐将待排序列排好序。二.基数排序举例现在有数组:278,109,63,930,589,184,505,269,8,83 第一次根据各位数将数组划分为10个队列(当然其中的某些队列可能不含有元素) 0:930 1: 2: 3:63,83 4:184 5:505 6: 7: 8:278,8 9:109,589,269 然后收集成序列: 930,原创 2015-10-15 11:21:11 · 459 阅读 · 0 评论 -
插入排序——直接插入排序
一.插入排序的基本思想将一个记录插入已排序好的有序表中,从而得到一个新的记录数加1的有序表。要点:设立哨兵,作为临时存储和判断数组边界之用。所谓的哨兵,就是即将插入的记录。二. 示例如果碰见相等的元素,会被插到后面,所以,相等元素的前后顺序没有改变,插入排序是稳定的。三.算法实现 public void insertSort(int[] array){ for原创 2015-10-11 23:14:33 · 542 阅读 · 0 评论 -
数据结构分类
数据结构可分为四类:集合、线性结构、树形结构、图形结构线性结构举例:数组、链表、队列、栈树形结构举例:二叉树、平衡树、排序树等图形结构举例:有向图、无向图等另外,按照逻辑分类,数据结构又可以分为线性结构和非线性结构按照存储方式分类,又可以分为顺序存储、链式存储、索引存储。散列存储原创 2015-09-18 09:26:18 · 2098 阅读 · 0 评论 -
选择排序——简单选择排序
一.基本思想在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。二.操作方法第一趟,从n个记录中找出关键码最小的记录与第一个记录交换; 第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换; 以此类推…..原创 2015-10-12 22:58:32 · 503 阅读 · 0 评论 -
插入排序——希尔排序
一.希尔排序的基本思想将整个序列按照一定的增量分成若干个子序列分别进行直接插入排序,待整个序列基本有序时,再对整个序列进行直接插入排序。二.操作方法选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;按增量序列个数k,对序列进行k 趟排序; 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序原创 2015-10-12 21:18:05 · 447 阅读 · 0 评论 -
选择排序——堆排序
堆排序是一种树形选择排序,是对直接选择排序的有效改进。一.基本思想堆的定义如下:具有n个元素的序列(k1,k2,…,kn),当且仅当满足 时称之为堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最小项或最大项,相应的堆称为小顶堆或大顶堆。 若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的。如: (转载 2015-10-13 22:32:28 · 592 阅读 · 0 评论 -
交换排序——快速排序
一.基本算法1)选择一个基准元素,通常选择第一个元素或者最后一个元素; 2)通过一趟排序讲待排序的记录分割成独立的两部分,其中基准元素左边的元素均比基准元素小,右边的元素均比基准元素大; 3)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。二.快速排序示例1.一趟排序的过程 2.排序的全过程 三.快速排序的Java实现 /** * 快速排序 *转载 2015-10-14 21:54:38 · 432 阅读 · 0 评论 -
5.Java数据结构原理解析-Stack系列
一、Stack简介在Java中,Stack是一个类而非接口,下面是Stack的类关系图。 Stack继承自Vector,所以是提供了入栈和出栈等基本操作。二、Stack的实现原理1、底层数据结构Stack是基于Vector来实现,底层使用的是数组,当数组容量不够时进行扩容。2、入栈——push(E e)public E push(E item) { ...原创 2018-04-30 15:08:12 · 558 阅读 · 0 评论