ITPub博客

首页 > 应用开发 > Java > 三向切分的快速排序和优化

三向切分的快速排序和优化

原创 Java 作者:壹頁書 时间:2016-09-22 16:38:27 0 删除 编辑


  1. public class Sort{
  2.     public static void main(String[] args){
  3.         Integer[] data={100,20,21,28,22,26,80,33,3,2,9,8,7,10,77,66,99,96,91,94};
  4.         BaseSort s=new Quick3Way(data);

  5.         s.show(data);

  6.         System.out.println(s.isSorted(data));
  7.     }
  8. }



  9. class Quick3Way extends BaseSort{
  10.     public Quick3Way(Comparable[] data){
  11.         sort(data,0,data.length-1);
  12.     }

  13.     @Override
  14.     void sort(Comparable[] data, int lo, int hi) {
  15.         if(hi<=lo){
  16.             return;
  17.         }
  18.         int lt=lo,i=lo+1,gt=hi;
  19.         Comparable v=data[lo];
  20.         while(i<=gt){
  21.             int cmp=data[i].compareTo(v);
  22.             if(cmp<0) {
  23.                 exch(data, lt++, i++);
  24.             }else if(cmp>0){
  25.                 exch(data,i,gt--);
  26.             }else{
  27.                 i++;
  28.             }
  29.         }
  30.         sort(data,lo,lt-1);
  31.         sort(data,gt+1,hi);
  32.     }
  33. }
  34. abstract class BaseSort {
  35.     abstract void sort(Comparable[] data,int lo,int hi);

  36.     //比较
  37.     public boolean less(Comparable v,Comparable w){
  38.         return v.compareTo(w)<0;
  39.     }

  40.     //打印
  41.     public void show(Comparable[] data){
  42.         for(int i=0;i<data.length;i++){
  43.             System.out.print(data[i]+" ");
  44.         }
  45.         System.out.println("");
  46.     }

  47.     //验证
  48.     public boolean isSorted(Comparable[] data){
  49.         for(int i=1;i< data.length;i++){
  50.             if(less(data[i],data[i-1]) )
  51.                 return false;
  52.         }
  53.         return true;
  54.     }

  55.     //交换
  56.     public void exch(Comparable[] data,int i,int j){
  57.         Comparable t=data[i];
  58.         data[i]=data[j];
  59.         data[j]=t;
  60.     }
  61. }

if(hi<=lo){ return; }
小数组可以改为插入排序。
int M=5;  if(hi<=lo+M){
    Insertion.sort(data,lo,hi);  return;  }

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-2125329/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 二叉堆优先队列
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339922