常见算法
Franco蜡笔小强
小码农
展开
-
LRU (最近最少使用) 缓存机制:时间复杂度O(1)
/** * Double Linked List * 用了一个特别的双向的ListNode,有了head和tail,这样就大大加快了速度。 * 主要加快的就是那个‘更新排位’的过程,找到item hashmap O(1), 做减法换位也都是O(1)* Overall O(1)*##### 巧妙点* 1. head和tail特别巧妙:除掉头和尾,和加上头和尾,就都特别快。...原创 2018-10-31 11:40:19 · 3084 阅读 · 1 评论 -
排序算法(八)——基数排序
基本思想基数排序(Radix Sort)是在桶排序的基础上发展而来的,两种排序都是分配排序的高级实现。分配排序(Distributive Sort)的基本思想:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性阶:O(n)。 先来看一下桶排序(Radix Sort)。桶排序也称为箱排序(Bin Sort),其基本思想是:设置若干个桶,依...原创 2017-11-13 10:52:08 · 295 阅读 · 0 评论 -
排序算法(七)——堆排序
基本思想堆排序是一种树形选择排序,是对直接选择排序的改进。 首先,我们来看看什么是堆(heap):(1)堆中某个节点的值总是不大于或不小于其父节点的值;(2)堆总是一棵完全二叉树(Complete Binary Tree)。 完全二叉树是由满二叉树(Full Binary Tree)而引出来的。除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树称为满二叉树。...原创 2017-11-13 10:45:08 · 318 阅读 · 0 评论 -
排序算法(六)——希尔排序
基本思想希尔排序是基于插入排序的,又叫缩小增量排序。在插入排序中,标记符左边的元素是有序的,右边的是没有排过序的,这个算法取出标记符所指向的数据,存入一个临时变量,接着,在左边有序的数组中找到临时变量应该插入的位置,然后将插入位置之后的元素依次后移一位,最后插入临时变量中的数据。试想,假如有一个很小的数据项在靠近右端的位置上,把这个数据项插入到有序数组中时,将会有大量的中间数据项需要右...原创 2017-11-13 10:44:17 · 338 阅读 · 0 评论 -
排序算法(五)——快速排序
基本思想快速排序也是基于分治算法得。步骤如下:(1)选择一个基准元素,通常选择第一个元素或者最后一个元素;(2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值比基准值大;(3)此时基准元素在其排好序后的正确位置;(4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。上图中,演示的是第一轮快速排...原创 2017-11-13 10:39:51 · 236 阅读 · 0 评论 -
排序算法(四)——归并排序与递归
基本思想分析归并排序之前,我们先来了解一下分治算法。分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。分治算法的一般步骤:(1)分解,将要解决的问题划分成若干规模较小的同类问题;(2)求解,当子问题划分得足够小时,用较简单的方法解决;(3)合并,按原问题的要求,将子问题的解逐层合并构...原创 2017-11-13 10:38:40 · 348 阅读 · 0 评论 -
栈相关算法
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。class Solution { public boolean isValid(String s) { if (s == null || s.len...原创 2018-11-02 20:29:52 · 1806 阅读 · 0 评论 -
冒泡,插入,选择排序总结
冒泡排序中数据的交换操作:if (a[j] > a[j+1]) { // 交换 int tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; flag = true;}插入排序中数据的移动操作:if (a[j] > value) { a[j+1] = a[j]; // 数据移动} else { break;...原创 2018-11-06 14:41:49 · 484 阅读 · 0 评论 -
排序算法(二)——选择排序及改进
选择排序基本思想冒泡排序中有一个缺点,比如,我们比较第一个数a1与第二个数a2的时候,只要a1比a2大就会交换位置,但是我们并不能确定a2是最小的元素,假如后面还有比它更小的,该元素还会与a2再次进行交换,而且这种交换有可能发生多次才能确定a2的最终位置。选择排序可以避免这种耗费时间的交换操作,从第一个元素开始,扫描整个待排数组,找到最小的元素放之后再与第一个元素交换位置,然后再从...原创 2017-11-10 17:35:43 · 378 阅读 · 0 评论 -
排序算法(三)——插入排序及改进
插入排序基本思想在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数找到相应位置并插入,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。java实现//插入排序 public void insertionSort(){ int len = array.length; ...原创 2017-11-10 17:40:47 · 383 阅读 · 0 评论 -
排序算法(一)——冒泡排序及改进
排序算法概述所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。稳定性:一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。如果算法是稳定的有什么好处呢?排序算法如果是稳...原创 2017-11-10 17:33:51 · 518 阅读 · 0 评论 -
队列实现
一、数组实现public class ArrayQueue { //存储数据的数组 private String[] items; //记录数组容量 private int n; private int size; //head记录队头索引,tail记录队尾索引 private i...原创 2018-11-03 20:54:43 · 131 阅读 · 0 评论 -
链表相关算法
两个有序的链表合并将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4/** * Definition for singly-linked list. * public class ListNo...原创 2018-11-01 12:48:53 · 414 阅读 · 0 评论 -
排序算法(九)——八大排序算法总结
八大排序算法的稳定性及复杂度总结如下: 选择排序算法准则每种排序算法都各有优缺点。因此,在实用时需根据不同情况适当选用,甚至可以将多种方法结合起来使用。影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的。相反,有时平均时间复杂度高的算法可能更适合某些特殊情况。同时,选择算法时还得考虑它的可读性,以利于软件的维护。一般而言,需要考虑的因素有以下四点: 1.待...原创 2017-11-13 10:52:56 · 262 阅读 · 0 评论