实际快速排序 -分割策略

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

public static super AnyType>>
void quicksort(AnyType [] a)
{
   quicksort(a, 0, a.length-1);
}

private static final int CUTOFF= 3;

public static  void swapReferences(AnyType [] a, int index1, int index2)
{
   AnyType tmp= a[index1];
   a[index1]= a[index2];
   a[index2]= tmp;
}

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

你可能感兴趣的:(算法,数据结构与算法分析)