快排代码如下 注释写的很详细
/** * @Description: 快速排序 * @Author: cckong * @Date: 2021/1/20 */ public class QuickSort { //比较函数 因为数组是Comparable 使用多态进行调用 public static boolean less(Comparable a, Comparable b) { return a.compareTo(b)<0; } //交换函数 public static void exc(Comparable[] a,int i,int j){ Comparable tmp=a[i]; a[i]=a[j]; a[j]=tmp; } public static void sort(Comparable[] a){ sort(a,0,a.length-1); } public static void sort(Comparable[] a,int lo,int hi){ if(hi<=lo) return; int j=partition(a,lo,hi);//确定切分元素所在位置 并进行交换(此时j前都小于切分元素,j后都大于切分元素) sort(a,lo,j-1); sort(a,j+1,hi); } public static int partition(Comparable[] a,int lo,int hi){ int i=lo,j=hi+1; Comparable v=a[lo]; while(true){ //因为是lo和hi+1开始和结尾 所以要用++i和--j //这一步是为了找出在前半部分 大于v的数 while(less(a[++i],v)) if(i==hi) break;//到尾巴停下 //找出后半部分小于v的数 while (less(v,a[--j])) if(j==lo) break;//到头停下 if(i>=j) break;//两指针相遇则返回 exc(a,i,j);//交换大数和小数 } //这里只能将切分元素和a[j]交换 exc(a,lo,j); return j; } public static void main(String[] args) { Comparable[] a=new Comparable[20]; for (int i = 0; i < 20; i++) { //Math.random()随机出【0,1)的小数 a[i]=(int)(Math.random()*100); System.out.println(a[i]); } sort(a);//也可以直接调用sort(a,0,a.length-1) for (int i = 0; i < 20; i++) { System.out.print(a[i]+" ");; } } }
优化方式
(1)取第一个元素作为切分元素 对于随机数组效果很好。
如果对于有序或者重复数组 就退化成冒泡排序了。时间复杂度变成On2
可以选择随机位置作为切分元素。
(2)对于数组长度小于一定数量,可以使用插入排序。
就像Arrays.sort一样,
<47 直接插入排序
47< <286 双轴快速排序
>286 根据连续性判断 连续性好归并。不好 双轴快排
双轴快排和三向切分:https://www.cnblogs.com/nullzx/p/5880191.html