快速排序详解

为什么要使用快速排序呢?相信大家都只是为了快速排序算法而学习快速排序,那么下面就来说一下快速排序的应用场景:

1、在部分有序的集合中进行快速排序,会大大降低时间跟空间复杂度,因为它是跳跃式交换,并非类似与冒泡排序的相邻交换。

2、它的最坏的时间复杂度跟冒泡排序一样都是O(n^2),但是平均复杂度是O(nlogn),总体来讲如果待排序的集合部分有序的话,快速排序要比其他排序更快。

快速排序算法思想:

1、每次选取结合最左边(右)的值作为监视哨

2、后通过两个变量left和right来当作待排集合的的变换下标

3、一遍循环将数组分为两部分,左边的值都小(大)于监视哨的值,右边的都大(小)于监视哨的值

4、继续遍历分出来的子集合

代码献上:

package test;
 
/** 
* @author HRX
* @version 创建时间:2018年9月30日 下午5:10:23 
* 类说明 
*/
public class Tree {
	public static void main(String[] args) {
		int[] num = {3,2,1,7,3,1,4,10,2};
		sort(num, 0, num.length-1);
		for(int x : num)
			System.out.println(x);
	}
	public static int divide(int[] num ,int left ,int right){	//划分算法,将数组由一个value分为两部分
		int n = num[left];
		System.out.println(left+"....."+right);
		while(left < right){
			while(left<right && n <= num[right])		//这注意千万不能用<=因为入伙两边相等的话,会将后边的或者前边的给跳过排序去
				right --;
			if(left<right){							//顺序不能变,因为n=num[left],所以要先将num[left]的值替换掉
				num[left] = num[right];
				left++;
			}
			while(left<right&&n > num[left])		
				left++;
			if(left<right){
				num[right] = num[left];
				right--;
			}
		}	
		num[left] = n;								//排序完成后,将中间位置的值换成用来比较的value值即n
		return left;
	}
	 public static void sort(int[] num ,int l ,int r){	//递归排序
		 if(l > r)
			 return;
		 int x = divide(num, l, r);
		 sort(num,l , x-1 );
		 sort(num,x+1 , r);
	 }
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值