pingh14

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2014年2月13日

摘要: 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到 阅读全文
posted @ 2014-02-13 09:06 pingh14 阅读(206) 评论(0) 推荐(0) 编辑

摘要: 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。两个有序数组归并到一个数组中 public static void mergeArray(int[] a ,int[] b,int[]c){ int i = 0; int j = 0; int k =0; whil... 阅读全文
posted @ 2014-02-13 01:17 pingh14 阅读(214) 评论(0) 推荐(0) 编辑

2014年2月9日

摘要: 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例第一次gap = 10 / 2 = 549 38 65 ... 阅读全文
posted @ 2014-02-09 22:08 pingh14 阅读(187) 评论(0) 推荐(0) 编辑

2014年2月1日

摘要: 冒泡排序1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为0就重复前面二步,否则排序完成。时间复杂度图示:每次排序都让最大的数沉底冒泡1 代码实现public class BubbleSort { public static void sort(int[] arr){ for(int i =0;i a[j]) { Swap(a[j -... 阅读全文
posted @ 2014-02-01 11:48 pingh14 阅读(290) 评论(0) 推荐(0) 编辑

2014年1月8日

摘要: http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/index.html?ca=drs-https://visualvm.java.net/zh_CN/gettingstarted.htmlhttp://blog.csdn.net/fenglibing/article/details/6298326http://freewind.me/blog/20111023/479.html 阅读全文
posted @ 2014-01-08 16:42 pingh14 阅读(162) 评论(0) 推荐(0) 编辑

2014年1月7日

摘要: Java 语言中的 volatile 变量可以被看作是一种 “轻量级的synchronized”;与synchronized块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。锁提供了两种主要特性:互斥(mutual exclusion)和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加 阅读全文
posted @ 2014-01-07 00:01 pingh14 阅读(434) 评论(0) 推荐(0) 编辑

2014年1月6日

摘要: 合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性,如果线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。第四:提供定时执行、定期执行、单线程、并发数控制等功能。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。Java里面线程池的顶级接口是Executor,但是严格意义上讲Execu 阅读全文
posted @ 2014-01-06 02:05 pingh14 阅读(594) 评论(0) 推荐(0) 编辑

摘要: CountDownLatch的介绍和使用:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达0之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。使用场景:在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。 这个时候就可以使用CountDo 阅读全文
posted @ 2014-01-06 00:24 pingh14 阅读(1486) 评论(2) 推荐(0) 编辑

2014年1月4日

摘要: 乐观锁 每次操作时不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止悲观锁 是会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。乐观锁可以使用volatile+CAS原语实现,读取内存值的方式实现了乐观锁,方法:第一,比较内存值和期望值;第二,替换内存值为要替换值。悲观锁可以使用synchronize的以及Lock。CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。例如AtomicInteger的incrementAndGet的实现就用到了compareAndSet(CAS),如下代码所示 阅读全文
posted @ 2014-01-04 23:16 pingh14 阅读(1000) 评论(0) 推荐(0) 编辑

2014年1月3日

摘要: 摘要从使用场景的角度出发来介绍对ReentrantLock的使用,相对来说容易理解一些。场景1:如果已加锁,则不再重复加锁a、忽略重复加锁。b、用在界面交互时点击执行较长时间请求操作时,防止多次点击导致后台重复执行(忽略重复触发)。以上两种情况多用于进行非重要任务防止重复执行,(如:清除无用临时文件,检查某些资源的可用性,数据备份操作等)if (lock.tryLock()) { //如果已经被lock,则立即返回false不会等待,达到忽略操作的效果 try { //操作 } finally { lock.unlock(); }}场景2:如果发现该操作已... 阅读全文
posted @ 2014-01-03 23:36 pingh14 阅读(2175) 评论(0) 推荐(0) 编辑