排序算法之快速排序java实现

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;
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值