为什么要使用快速排序呢?相信大家都只是为了快速排序算法而学习快速排序,那么下面就来说一下快速排序的应用场景:
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);
}
}