简介
快速排序(quick-sort)算法采用的是分治法策略。首先从要排序的数组中找一个基准,然后将数组中的值分别与基准对比,将大于基准的数值放入基准的一侧,小于基准的数值放入另一侧,因此,数组将会被基准分为两部分。然后再分别对两部分内容选择基准,进行循环迭代,依次达到排序的效果。
通常排序中,在首次循环时,使用数组中的第一个数作为基准,对数组分为两部分,分类之后,基准将处于分界线的位置(也就是第一次排序后,基准的位置一定是正确的,其他的不确定),然后在对两部分分别选择基准,通过迭代进行分类。在每一个排序过程中,唯一能保证的就是基准的位置是正确的。
比如,我们选择{30,40,60,10,20,50}这个数列,在第一次排序时,选择30为基准,排序后的结果为{20,10,30,60,40,50},那么基准30的位置一定是正确的,接着,我们对{20,10,30,60,40,50}剩余的两部分分别选择基准20,60进行排序,产生的结果分别为{10,20}和{50,40,60},其中20,60的位置一定是正确的,所以,{10,20}已经排序完成,同样的道理对{50,40,60}得出结果。整体的排序次序如下(标颜色的为基准的选取)
30,40,60,10,20,50
20,10 ,30, 60,40,50
10,20, 30, 60,40,50
10,20, 30, 50,40, 60
10,20, 30, 40,50, 60
代码实现
public class QuickSort {
public static void main(String[] args) {
Vector<Integer> vector= new Vector<>();
vector.add(30);
vector.add(40);
vector.add(60);
vector.add(10);
vector.add(20);
vector.add(50);
QuickSort quickSort = new QuickSort();
quickSort.sortMethod(vector,0,vector.size()-1);
}
/**
* 快速排序算法.
* @param vector 需要排序的数组
* @param left 数组的左边界
* @param right 数组的右边界
* @return
*/
private Vector<Integer> sortMethod(Vector<Integer> vector,int left,int right){
//当右侧大于左侧时,不进行检测
if(right>left){
int leftCur = left;
int rightCur = right;
int cur = vector.get(left);
while(rightCur>leftCur){
//从右向左找小于cur的数
while(rightCur>leftCur&&vector.get(rightCur)>cur){
rightCur--;
}
if(rightCur>leftCur){
vector.set(leftCur++,vector.get(rightCur));
}
//从左向右找大于cur的数
while (rightCur>leftCur&&vector.get(leftCur)<cur){
leftCur++;
}
if(rightCur>leftCur){
vector.set(rightCur--,vector.get(leftCur));
}
}
vector.set(leftCur,cur);
//打印输出排序的内容
vector.forEach(a-> System.out.print(a+","));
System.out.println();
//递归调用
sortMethod(vector,left,leftCur-1); //对左半部分进行排序
sortMethod(vector,leftCur+1,right); //对右半部分进行排序
}
return vector;
}
}
输出结果
20,10,30,60,40,50,
10,20,30,60,40,50,
10,20,30,50,40,60,
10,20,30,40,50,60,
小结
1、快速排序算法的时间复杂度在最坏的情况下是,平均复杂度为lg(N+1).
2、快速排序算法不属于稳定排序算法.
参考文献