快速排序 Java实现以及效率分析

原创 2018年04月15日 11:30:20

快速排序 Java实现以及实际效率对比

一、快速排序的Java实现

二、快速排序的时间复杂度以及与归并排序的实际效率对比

快速排序是分治法的一种应用,主要思路是以一个基准值为参照,通过将小于基准值的数放到基准值的左边,将大于基准值的数放到右边,然后在对左右分别递归排序。

详细的思路以及图解可以参照其他资料,但网络上某些Java实现存在一定的问题,学习的时候跟着别人的代码思路走也很难受,这里主要提供一种快速排序的Java实现。

测试了很多次完全升序和降序,以及千万级别长度的数组,正确性应该没有问题,如有错误请指正。

一、快速排序的Java实现:

package com.ryo.algorithm.sort;

public class QuickSort implements Sort{
	
	private int cursorLo;
	private int cursorHi;
	private int baseVal;
	private int temp;

	@Override
	public int[] sort(int[] arr) {
		sort(arr ,0 ,arr.length-1);
		return arr;
	}
	
	public void sort(int[] arr ,int low ,int high) {
		if(high - low > 1) {//进入此if说明子数组长度至少为3,可以进行排序
			baseVal = arr[low];//保存基准值
			cursorLo = low + 1;//左侧游标
			cursorHi = high;//右侧游标
			while(cursorLo != cursorHi) {
				while(cursorLo < cursorHi && arr[cursorLo] <= baseVal) {
					cursorLo++;
				}
				while(cursorHi > cursorLo && arr[cursorHi] >= baseVal) {
					cursorHi--;
				}
				swap(arr ,cursorLo ,cursorHi);//当cursorLo == cursorHi时只是原地交换
			}
			if(arr[cursorLo] < baseVal) {
				swap(arr ,cursorLo ,low);	
				cursorLo--;//为下一次递归准备边界值
			}
			else {
				swap(arr ,cursorLo-1 ,low);
				cursorLo = cursorLo - 2;//为下一次递归准备边界值
			}
			sort(arr ,low ,cursorLo);
			sort(arr ,cursorLo+2 ,high);//若cursorLo+2  > high或其他情况也没关系,开始执行后由于sort方法两个if的存在什么也不会发生
		}	
		else if(high - low == 1) {//需要快排的子数组长度仅为2的时候,只做比较交换的工作
			if(arr[low] > arr[high]) {
				swap(arr ,low ,high);
			}
		}
	}
	
	private void swap(int[] arr ,int index1 ,int index2) {
		temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}

}

二、快速排序的时间复杂度以及与归并排序的实际效率对比:

快速排序的时间复杂度:

Cbest(n) = nLog2(n)

Cworst(n) = n^2

Cavg(n) = 2nLn(n) ≈ 1.39nLog2(n)

与归并排序的效率对比

测试环境:Jre1.8_161  eclipse Version: Oxygen.3a Release (4.7.3a)

测试内容:对0-1000000随机整数组成的长度一百万的数组进行排序

快速排序:

归并排序:

其实在测试中发现快速排序的运行时间跨度很大,最大的一次达到了170+ms,被我剔除了,而归并排序基本稳定在140 - 150ms左右,这是因为归并排序最坏、平均、最好的时间复杂度均接近O(nlog(n))

两种算法在这个数量级的对比下似乎快速排序优势也没那么明显

当然这里受具体实现细节的影响,为了凸显出算法本身的结构优势,这里使用千万级数组(对应随机数也扩展到相应的范围)再进行测试:

由于将一千万个结果打印出来很耗时,这里注释掉了打印语句

长度一千万:

快速排序:

 

归并排序:

 

长度两千万:

快速排序:

  

 

归并排序:

  

扩到到千万的级别之后再也没有出现归并排序快于快速排序的情况了,且差距随着长度的增加理所当然地在增大。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/My_dearest_/article/details/79947704

java排序算法-比较快速排序,冒泡排序,双向冒泡排序的执行效率

快速排序 原理是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排...
  • twj13162380953
  • twj13162380953
  • 2016-12-28 17:46:38
  • 888

插入排序,归并排序,快速排序时间效率测试

随机产生100000个数据,分别用三种算法测试排序的时间,机器和代码都略渣。。。 /* 插入排序、归并排序、快速排序时间测试 */ #include #include #include ...
  • wz2671
  • wz2671
  • 2016-05-03 00:18:43
  • 960

堆排序、快速排序(递归与非递归)、归并排序效率比较

堆排序、快速排序(递归与非递归)、归并排序效率比较 为了比较这四种排序的效率,程序中将四种排序算法封装成函数,并且随机生成10000000个随机数,用GetTickCount()函数获取精确到毫...
  • L_BestCoder
  • L_BestCoder
  • 2016-12-26 19:33:36
  • 962

java实现各种排序算法(包括冒泡排序,选择排序,插入排序,快速排序(简洁版))及性能测试

1、冒泡排序是排序里面最简单的了,但性能也最差,数量小的时候还可以,数量一多,是非常慢的。      它的时间复杂度是O(n*n),空间复杂度是O(1)      代码如下,很好理解。 ...
  • qq_21439971
  • qq_21439971
  • 2016-12-27 14:36:43
  • 8427

快速排序的几个实现及其在效率上的考虑

快速排序,Quicksort,通常被认为是在基于比较的排序中,对于大型的,随机的输入具有最快的排序速度的程序。C标准库中的qsort,c++ STL中的sort都是基于快速排序的(STL中的sort实...
  • icelights
  • icelights
  • 2015-09-01 17:21:47
  • 1220

关于快速排序的一些见解(递归和非递归以及优化)

最近看到一些笔试题,很多都考到了快速排序,故今天来此谈谈个人对快速排序的一些看法(理解可能有理解不恰到的地方,希望高人能多多指点) 快速排序,顾名思义,那就是一个字 快,但其实有的时候并不是我们所想的...
  • qq_35623393
  • qq_35623393
  • 2017-10-21 22:42:25
  • 54

快速排序实现以及时间复杂度分析

快速排序思想: 1.选择数组左边第一个元素为枢轴pivot,把数组所有元素比pivot大的放在数组右边,比pivot小的放在左边 (复杂度为O(n)) 2.对pivot左右两边的序列分别进行快速...
  • yuanba_xs
  • yuanba_xs
  • 2017-03-13 22:11:57
  • 507

快速排序原理及java实现

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排...
  • crazy_rain
  • crazy_rain
  • 2007-04-20 10:44:00
  • 12561

随机快速排序的java代码

public class Randomized_QuickSort {     public static void main(String[] args) {           Randomi...
  • randomnet
  • randomnet
  • 2012-03-11 13:51:32
  • 2093

快速排序(附Java实现和分析)

总结一下快速排序,如有错误或者不足,欢迎交流讨论。 1、快速排序的思路快速排序和归并排序的思路很相似,都是采取的分治思想。快速排序通过选择一个元素,该元素称为枢轴元素或切分元素,然后将它放到一个合适...
  • xiaoguobaf
  • xiaoguobaf
  • 2016-04-07 12:21:07
  • 3778
收藏助手
不良信息举报
您举报文章:快速排序 Java实现以及效率分析
举报原因:
原因补充:

(最多只允许输入30个字)