题目提示直接告诉我们了
有两种情况:
1.排序的数列包含a.length-1, 因为右边存在最大了,所以无需判断边界
2.排序的子数列的右边一位是上一次排序的v,肯定比他小,所以也无需判断边界
package Cap2_3;
import Cap2_1.SortTemplate;
import edu.princeton.cs.introcs.StdOut;
import edu.princeton.cs.introcs.StdRandom;
public class Quick extends SortTemplate{
public static void sort(Comparable[] a){
StdRandom.shuffle(a);
int temp=0;
for(int i=1;i<a.length;i++)
if(less(a[temp], a[i])) temp = i;
exch(a, temp, a.length-1);
sort(a, 0, a.length-1);
}
private static void sort(Comparable[] a, int lo, int hi){
if(hi <= lo) return;
int j=partition(a, lo, hi);
sort(a, lo, j-1);
sort(a, j+1, hi);
}
private static int partition(Comparable[] a, int lo, int hi){
int i=lo, j=hi+1;
Comparable v = a[lo];
while(true){
while(less(a[++i], v));
while(less(v, a[--j]));
if(j>i) exch(a, i, j);
else break;
}
exch(a, lo, j);
return j;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int N=10;N<=100000;N*=10){
Integer[] a = new Integer[N];
for(int i=0;i<N;i++)
a[i]=i;
StdRandom.shuffle(a);
sort(a);
assert isSorted(a);
}
}
}