算法 第四版 2.3.17

来源:互联网 发布:程序员入门知识 编辑:程序博客网 时间:2024/06/06 04:49

题目提示直接告诉我们了

有两种情况:

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 stubfor(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);}}}


原创粉丝点击