实际快速排序 -分割策略

来源:互联网 发布:linux jdk tar.gz下载 编辑:程序博客网 时间:2024/06/05 20:55

快速排序,枢纽元(比较值)理论上选哪个都可以。实际快速排序包括划分策略 和递归调用。

public static <AnyType extends Comparable<? super AnyType>>void quicksort(AnyType [] a){   quicksort(a, 0, a.length-1);}private static final int CUTOFF= 3;public static <AnyType> void swapReferences(AnyType [] a, int index1, int index2){   AnyType tmp= a[index1];   a[index1]= a[index2];   a[index2]= tmp;}private static <AnyType extends Comparable<? super AnyType>>AnyType median3(AnyType [] a, int left, int right){   //left, center, right 上的元素从小到大   int center= (left+right)/2;   if(a[center].compareTo(a[left])< 0)      swapReferences(a, left, center);   if(a[right].compareTo(a[left] < 0))      swapReferences(a, left, right);   if(a[right].compareTo(a[center]) < 0)      swapReferences(a, center, right);   //center(pivot)放到right-1位置   swapReferences(a, center, right-1);   return a[right-1];}private static <AnyType extends Comparable<? super AnyType>> void quicksort(AnyType [] a, int left, int right){   if(left+CUTOFF <= right);   {      AnyType pivot= median3(a, left, right);      //Begin partitioning      int i= left, j= right-1;      for(;;)      {         //++前缀操作符能保证比较前,推进,若是后缀运算符,当a[i]=a[i]=pivot 时出现死循环         while(a[++i].compareTo(pivot) < 0) {}         while(a[--j].compareTo(pivot) > 0) {}         if(i < j)            swapReferences(a, i, j);         else            break; //i 不可能等于j, 因为上面两个while语句 互斥, i和j不可能指向同一个位置。      }      //restore pivot      swapReferences(a, i, right-1);      quicksort(a, left, i-1);      quicksort(a, i+1, right);   }   else      insertionSort(a, left, right);}
0 0
原创粉丝点击