当前位置: 代码迷 >> 综合 >> 算法 第四版 2.3.17
  详细解决方案

算法 第四版 2.3.17

热度:90   发布时间:2023-09-23 03:22:41.0

题目提示直接告诉我们了

有两种情况:

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


  相关解决方案