ITPub博客

首页 > 应用开发 > Java > 归并排序

归并排序

原创 Java 作者:壹頁書 时间:2016-09-18 17:14:50 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 MergeBU(data);
  5.   
  6.         s.show(data);
  7.   
  8.         System.out.println(s.isSorted(data));
  9.     }
  10. }
  11. //希尔排序,自顶向下归并排序
  12. class Merge extends BaseSort{
  13.     private Comparable[] data;
  14.     protected Merge(Comparable[] data) {
  15.         super(data.length);
  16.         this.data=data;
  17.         sort(this.data,0,data.length-1);
  18.     }
  19.   
  20.     @Override
  21.     void sort(Comparable[] data, int lo, int hi) {
  22.         if(hi<=lo){
  23.             return;
  24.         }
  25.         int mid=lo+(hi-lo)/2;
  26.         sort(data,lo,mid);
  27.         sort(data,mid+1,hi);
  28.         merge(data,lo,mid,hi);
  29.     }
  30. }
  31.   
  32. //自底向上归并排序
  33. class MergeBU extends BaseSort{
  34.     private Comparable[] data;
  35.   
  36.     protected MergeBU(Comparable[] data) {
  37.         super(data.length);
  38.         this.data=data;
  39.   
  40.         int n=data.length;
  41.         for(int sz=1;sz<n;sz=sz+sz){
  42.             for(int lo=0;lo<n-sz;lo+=sz+sz){
  43.                 merge(data,lo,lo+sz-1,Math.min(lo+sz+sz-1,n-1));
  44.             }
  45.         }
  46.     }
  47.   
  48.     @Override
  49.     void sort(Comparable[] data, int lo, int hi) {
  50.     }
  51. }
  52. abstract class BaseSort {
  53.     abstract void sort(Comparable[] data,int lo,int hi);
  54.     protected Comparable[] aux;
  55.     protected BaseSort(int length){
  56.         aux=new Comparable[length];
  57.   
  58.     }
  59.     //原地归并的抽象方法
  60.     public void merge(Comparable[] a, int lo,int mid,int hi){
  61.         int i=lo,j=mid+1;
  62.         for(int k=lo;k<=hi;k++){
  63.             aux[k]=a[k];
  64.         }
  65.   
  66.         for(int k=lo;k<=hi;k++){
  67.             if(i>mid){
  68.                 a[k]=aux[j++];
  69.             } else if(j>hi){
  70.                 a[k]=aux[i++];
  71.             }else if(less(aux[j],aux[i])) {
  72.                 a[k] = aux[j++];
  73.             }else{
  74.                 a[k]=aux[i++];
  75.             }
  76.         }
  77.     }
  78.   
  79.     //比较
  80.     public boolean less(Comparable v,Comparable w){
  81.         return v.compareTo(w)<0;
  82.     }
  83.   
  84.     //打印
  85.     public void show(Comparable[] data){
  86.         for(int i=0;i<data.length;i++){
  87.             System.out.print(data[i]+" ");
  88.         }
  89.         System.out.println("");
  90.     }
  91.   
  92.     //验证
  93.     public boolean isSorted(Comparable[] data){
  94.         for(int i=1;i< data.length;i++){
  95.             if(less(data[i],data[i-1]) )
  96.                 return false;
  97.         }
  98.         return true;
  99.     }
  100. }

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

上一篇: MySQL内存使用
下一篇: 查看主机串号
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339893