Java实现快速排序

快速排序是一种高效的比较类排序算法,对比冒泡排序,它的每轮比较是跳跃式的,通过设置基数并一分为二来减少比较次数。算法平均时间复杂度为O(nlgn),最坏情况下为O(n2)。文中提供了详细的快速排序算法实现,并通过代码展示了排序过程。
摘要由CSDN通过智能技术生成

快速排序及其算法描述:

快速排序是一种比较高效的比较类排序算法,相比冒泡排序,快排中的每一轮比较是跳跃式的,为什么说是跳跃式的比较呢?这个问题待会再细说。
通过一轮比较将基数定位(一般按从小到大),并将数据一分为二,基数前面的数均比基数小,基数后面的数均比基数大,之后再对这两组数据分别继续进行比较。这就回到了刚才的问题:冒泡排序每一轮比较只是将比较区相邻两个数进行比较,对比较区最大的数据定位(大数沉淀,小数冒泡,一般按从小到大排序),而快速排序每一轮比较定位的基数的位置是可以不具有特殊性的,而且实现了将数据二分的功能,就不用像冒泡排序那样每次只进行相邻的数的比较,所以说是跳跃式的比较,通常能大大减小比较的次数,速度也就能大大提升了.
快速排序的平均时间复杂度为O(nlgn),当然最坏的情况下进行的是基数与相邻的数的比较和交换,时间复杂度为O(n2).

	[关于快排时间复杂度的分析推荐看这位博主的文章:](https://blog.csdn.net/weshjiness)
	接下来就是代码实现了:

public class QuickSort {
	public static int[] sort(int[] arr, int first, int last) {

		int i = first;
		int j = last;
		int t;
		//设置递归出口
		if (first > last)
			return arr;
		//设置基数,一般取首位上的数据
		int base = arr[first];
		while (i < j) {
		//从后面往前找小于基数的数据,标记
		//基数取第一个时必须先从后往前走,否则会出现以下情况:
		//基数本身在比较的数据中是最小的时,必然导致基数与后一位数据进行交换,且不可逆
		//很明显此时得到的二份数据已经不是最初设计快排算法时想要得到的数据了
			while (arr[j] >= base && i < j) {
				j--;
			}
		//从前面往后找大于基数的数据,标记
			while (arr[i] <= base && i < j) {
				i++;
			}
		//交换前面标记的两个数据
			if (i < j) {
				t = arr[i];
				arr[i] = arr[j];
				arr[j] = t;
			}
		}
		//交换基数与定位后位置上的数
		arr[first] = arr[i];
		arr[i] = base;
		//对左边数据递归调用快排
		sort(arr, i + 1, last);
		//对右边数据递归调用快排
		sort(arr, first, i - 1);
		return arr;
	}

	public static void main(String[] args) {
		int[] arr = new int[] {6,1,5,4,8,3,10,9,2};
		sort(arr, 0, arr.length - 1);
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值