实际快速排序 -分割策略

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

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值