原理
快速排序思想:
每次选出一个基准变量,依次从前找到第一个大于基准变量的元素,接着从后向前找到第一个小于基准变量的元素,交换两个变量位置,当所有变量都交换完成,及找到了基准变量的正确位置,然后将基准变量与正确位置的元素交换
继续采用分治策略,对基准变量前后分开使用快速排序
缺点
快速排序不适合具有重复变量的数组
Java代码
import java.util.Arrays;
/**
* @Author : dingshuangen
* @Date : Created in 2018/6/27 12:02
* @Description : 快速排序
*/
public class Qsort {
/**
*
* @param a 排序的目标数组
* @param p 开始位置
* @param q 结束位置
* @param <T> 实现了Comparable 接口
* @return 排好序的数组
*/
public static <T extends Comparable<T>> void qSort(T[] a,int p,int q){
//判断还有元素需要排序
if(p<q){
int mid = getMid(a,p,q);
//分治排序
qSort(a,p,mid-1);
qSort(a,mid+1,q);
}
}
/**
*
* @param a
* @param p
* @param q
* @param <T>
* @return
*/
private static <T extends Comparable<T>> int getMid(T[] a,int p,int q){
T x= a[p];//标记变量
int i=p+1;//前向下标
int j=q;//后向下标
//开始查找x的合适下标位置
while(true){
//从前向后查找,第一个大于x的元素下标
while(i<q&&a[i].compareTo(x)<0){
i++;
}
//从后向前,找到第一个小于x的元素下标
while(j>p&&a[j].compareTo(x)>0){
j--;
}
if (i>=j){
break;
}
//交换i,j位置元素
swap(a,i,j);
//System.out.println("交换位置:"+"a["+i+"]:"+a[i]+"<-->a["+j+"]:"+a[j]+"\n"+Arrays.toString(a));
}
//退出循环体,表示找到x的正确位置 j,前面全部小于x,后面全部大于x,交换x与j位置元素
swap(a,p,j);
//System.out.println("中间结果:"+Arrays.toString(a));
return j;//返回正确位置下标
}
//交换方法
private static <T> void swap(T[] a,int r,int q){
T temp = a[r];
a[r] = a[q];
a[q] = temp;
}
}