快速排序详解

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

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 QuickSort {
	public static void main(String[] args) {
		int[] num = {3,2,1,7,3,1,4};
		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){	//递归排序
		 int x = divide(num, l, r);
		 divide(num,l , x-1 );
		 divide(num,x+1 , r);
	 }
}

猜你喜欢

转载自blog.csdn.net/qq_39429962/article/details/82966578