package com.atguigu.me.algorithm.sort;
public class QuickSort {
public static void sort(Comparable[] c){
sort(c,0,c.length-1);
}
private static void sort(Comparable[] c, int lo, int hi) {
if(hi<=lo) return ;
int j = partition(c,lo,hi);
sort(c,lo,j-1);
sort(c,j+1,hi);
}
private static int partition(Comparable[] c, int lo, int hi) {
int i = lo, j = hi;
Comparable v= c[lo];//第一个元素
//这段代码按照c[lo]的值进行切分:就是移动i、j指针直到左边都小于c[lo],右边都大于c[lo]
while(true){
//扫描左右,检查扫描是否结束并交换元素
//当左边都小于c[lo]且指针已经相遇,停止循环
while(less(c[++i],v)){
if(i==hi){
break;
}
}
//当右边都大于c[lo]且指针已经相遇,停止循环
while(less(v,c[–j])){
if(j==lo){
break;
}
}
//当指针相遇, 停止循环
if(i>=j) break;
//前面所有条件(当左边都小于c[lo]且指针已经相遇;当右边都大于c[lo]且指针已经相遇;当指针相遇)不符合时, 交换c[i] 和 c[j]值。
exch(c,i,j);
}
//然后把该指针处的值和c[lo]交换 exch(c,lo,j);
exch(c,lo,j);
//返回转换后j的指针值
return j;
}
public static <T extends Comparable<T>> void exch(T[] ts,int t,int min){
T temp = ts[t];
ts[t] = ts[min];
ts[min] = temp;
}
public static <T extends Comparable<T>> boolean less(T t1,T t2){
return t1.compareTo(t2) <0;
}
public static void main(String[] args) {
Integer[] ins = new Integer[]{9,10,4,3,5,1,6,-4,100,67,56,3,9,706};
sort(ins);
for(int i = 0;i<ins.length;i++){
System.out.print(ins[i]+”–>”);
}
}
}