利用随机化的思想对快速排序进行优化
2013-11-06 15:00
169 查看
快速排序的基本思想是利用一轮排序让待排记录分为两部分,其中一部分均比另一部分小,然后再分别对两部分采用相同的思想进行排序。假设待排为一数组,首先任意选取一个记录(通常选择第一个记录)作为枢轴,然后按下述原则重新排列记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字都较它大的记录都安置在它的位置之后。这个过程即为一轮快速排序。
就平均时间而言,该算法具有较高效率(O(nlogn))。但当待排序记录的关键字有序或基本有序时,该算法退化为起泡排序,时间复杂度为O(n2)。
为改进之,引入随机化的思想,及枢轴的位置并非始终为第一个记录,而是随机的选择一个记录作为枢轴。具体代码如下:
就平均时间而言,该算法具有较高效率(O(nlogn))。但当待排序记录的关键字有序或基本有序时,该算法退化为起泡排序,时间复杂度为O(n2)。
为改进之,引入随机化的思想,及枢轴的位置并非始终为第一个记录,而是随机的选择一个记录作为枢轴。具体代码如下:
import java.util.Random; public class RQuickSort { public RQuickSort() { // TODO Auto-generated constructor stub } public void RQSort(int []a, int low, int hight) { if(low < hight){ int pivotkey = Partition(a, low, hight); RQSort(a, low, pivotkey-1); RQSort(a, pivotkey+1, hight); } } public int Partition(int [] a , int low, int hight){ //随机的给出枢轴的位置 Random random = new Random(); int index = random.nextInt(hight-low+1)+low; int temp = a[index]; a[index] = a[low]; a[low] = temp; int pivotkey = a[low]; while(low < hight){ while(low<hight && a[hight] >= pivotkey) --hight; int k = a[hight]; a[hight] = a[low]; a[low] = k; while(low<hight && a[low] <= pivotkey) ++low; k = a[low]; a[low] = a[hight]; a[hight] = k; } return low; } }
相关文章推荐
- 利用中位数进行快速排序
- 利用内存寻址进行快速排序的算法
- oracle11g利用分区表进行查询性能的优化
- 利用客户端缓存对网站进行优化
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
- 寻找数组中最小的k个数 "利用快速排序的思想"
- 利用客户端缓存对网站进行优化 - asp.net客户端缓存
- 利用快速排序思想求数组第k大元素
- 利用客户端缓存对网站进行优化
- 利用多核多线程进行程序优化[ZT]
- JAVAWEB开发之Hibernate详解(三)——Hibernate的检索方式、抓取策略以及利用二级缓存进行优化、解决数据库事务并发问题
- JAVA中对一维数组排序的方法(在快速排序上进行的优化)
- 如何利用客户端缓存对网站进行优化?
- 利用Xcode Profile和Analyze进行性能优化
- 利用多核多线程进行程序优化-转载
- 利用快速排序思想找出数组中第K大的数
- 如何利用客户端缓存对网站进行优化?
- 利用多核多线程进行程序优化
- 【Rosseta中文分词】python下利用HMM思想进行中文分词
- 利用冒泡排序的思想对符合格式的时间字符串进行排序