排序算法之快速排序java实现
2017-01-17 11:04
225 查看
1、快速排序基本思想
快速排序的基本思想是:一种划分交换排序。它采用了一种分治的策略,也可称其为分治法,是一种基于二叉树结构的交换排序方法。通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。首先来看一下快速排序算法的图解过程(图片来自网络):
快速排序是一种不稳定的排序方法,它是目前给予比较的内部排序方法中速度最快的,快速排序亦因此而得名。
快速排序需要一个栈空间来实现递归。
快速排序实质上是对冒泡排序的一种改进,它的效率与冒泡排序相比有很大的提高。
在冒泡排序过程中是对相邻两个记录进行关键字比较和互换的,这样每次交换记录后,只能改变一对逆序记录,而快速排序则从待排序记录的两端开始进行比较和交换,并逐渐向中间靠拢,每经过一次交换,有可能改变几对逆序记录,从而加快了排序速度。
2、复杂度分析
快速排序算法的时间复杂度与每次划分的记录关系很大。如果每次选取的记录都能均分成两个相等的子序列,这样的快速排序过程就是一棵完全二叉树结构,这时分解次数等于完全二叉树的深度。每次快速排序过程是否把待排序列这样划分,全部的比较次数都接近于n-1次,所以,最好情况下快速排序的时间复杂度为
。快速排序的最坏情况是记录已全部有序,此时n个记录待排序的根节点的分解次数就构成了一棵单右支二叉树,所以,最坏情况下快速排序的时间复杂度为
。一般情况下,记录的分布是随机的,序列的分解次数构成一棵二叉树,这样二叉树的深度接近于
,所以,快速排序算法在一般情况下的时间复杂度为
。
3、快速排序java实现
package sort; public class QuickSort { public static void main(String[] args) { int[] array = {60, 55, 48, 37, 10, 90, 84, 36}; quickSort(array, 0, array.length-1); for(int i = 0; i < array.length; i++){ System.out.print(array[i]+" "); } } public static void quickSort(int[] array, int left, int right){ int keyIndex; if(left < right){ //选取关键字,并根据关键字将数组分为两部分,左边部分小于关键字,右边部分大于关键字 keyIndex = partitionByKey(array, left, right); //递归调用快速排序算法,将左边部分继续划分,直到顺序完全正确 quickSort(array, left, keyIndex-1); //递归调用快速排序算法,将右边部分继续划分,直到顺序完全正确 quickSort(array, keyIndex+1, right); } } /*以keyValue作为关键字,并根据关键字将数组分为两部分,左边部分小于关键字,右边部分大于关键字*/ private static int partitionByKey(int[] array, int left, int right) { int keyValue = array[left]; while(left < right){ while(left < right && array[right] >= keyValue){ right--; } //将右边比关键字小的元素移到left位,right位空缺,等待左边部分比关键字大的元素移入 array[left] = array[right]; while(left < right && array[left] <= keyValue){ left++; } //将左边比关键字大的元素移到right位,left位空缺,等待右边部分比关键字小的元素移入 array[right] = array[left]; } //完成一次划分,此时将关键字放入数组中的空缺处 array[left] = keyValue; return left; } }
相关文章推荐
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序算法(二)_希尔排序、快速排序、归并排序的Java实现
- Java 常用排序算法实现--快速排序、插入排序、选择、冒泡
- Java实现-高效排序算法之快速排序
- 常见的排序算法(Java实现):冒泡、插入、选择、快速排序
- [排序算法]--快速排序的Java实现
- 排序算法---(4)快速排序---Java实现
- 经典排序算法(一)--冒泡排序、快速排序java实现
- 必须知道的八大种排序算法【java实现】(一) 冒泡排序、快速排序
- Java 常用排序算法实现--快速排序、插入排序、选择、冒泡
- 排序算法复习(Java实现): 插入,冒泡,选择,Shell,快速排序
- java 排序算法实现 其四:快速排序
- JAVA排序算法实现代码-快速(Quick Sort)排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 【转】排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 基本排序算法——快速排序java实现
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序算法之快速排序的思想以及Java实现
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序