您的位置:首页 > 编程语言 > Java开发

排序算法之快速排序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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐