Java中Arrays的sort方法

数组的排序,Java自带的Arrays类的sort方法主要内容包括插入排序结合分治排序两种排序算法在里面。
先分别介绍一下两种排序方式:
第一种:通过分治法实现的并归排序。
        @SuppressWarnings ( "unchecked"  )
        public  static  void  mergeSort(Comparable[] src , Comparable[] dest,  int  low,  int  high) {
              if  (high - low == 1) {
                    return ;
            }
              if  (high - low == 2) {
                    if  (dest[low].compareTo(dest[high - 1]) > 0) {
                         swap(dest, low, high - 1);
                  }
                    return ;
            }
              int  mid = ( low + high ) >> 1;
             mergeSort(dest, src , low, mid);
             mergeSort(dest, src , mid, high);
              for  ( int  i = low, p = low, q = mid; i < high; i++) {
                    if  (q == high|| (p != mid &&  src [p].compareTo(src[q]) < 0)) {
                        dest[i] = src[p++];
                  }  else  {
                        dest[i] = src[q++];
                  }
            }
      }
第二种:插入排序。
        private  static  void  InsertionSort(Comparable[] src,Comparable[] dest, int  low, int  high){
              for ( int  i=low;i<high;i++){
                    for ( int  j=i;j>low;j--){
                          if (dest[j].compareTo(dest[j-1])<0){
                               swap(dest, j, j-1);
                        }
                  }
            }
      }
还有一个工具方法
        private  static  void  swap(Object[] x,  int  a,  int  b) {
            Object t = x[a];
            x[a] = x[b];
            x[b] = t;
      }
整个Java类的内容如下:
public  class  ArraysSort {

        @SuppressWarnings ( "unchecked"  )
        public  static  void  mergeSort(Comparable[] src, Comparable[] dest,  int  low,  int  high) {
              if  (high - low == 1) {
                    return ;
            }
              if  (high - low == 2) {
                    if  (dest[low].compareTo(dest[high - 1]) > 0) {
                         swap(dest, low, high - 1);
                  }
                    return ;
            }
              int  mid = ( low + high ) >> 1;
             mergeSort(dest, src, low, mid);
             mergeSort(dest, src, mid, high);
              for  ( int  i = low, p = low, q = mid; i < high; i++) {
                    if  (q == high|| (p != mid &&  src[p].compareTo(src[q]) < 0)) {
                        dest[i] = src[p++];
                  }  else  {
                        dest[i] = src[q++];
                  }
            }
      }

        @SuppressWarnings ({  "unused"  ,  "unchecked"  })
        private  static  void  InsertionSort(Comparable[] src, Comparable[] dest, int  low,  int  high) {
              for  ( int  i = low; i < high; i++) {
                    for  ( int  j = i; j > low; j--) {
                          if  (dest[j].compareTo(dest[j - 1]) < 0) {
                               swap(dest, j, j - 1);
                        }
                  }
            }
      }

        private  static  String[] getStrings( int  length) {
            Random random =  new  Random();
            String[] strs =  new  String[length];
              for  ( int  i = 0; i < length; i++) {
                    int  temp = random.nextInt(999);
                  strs[i] = Integer. toString(temp);
            }
              return  strs;
      }

        private  static  void  swap (Object[] x,  int  a,  int  b) {
            Object t = x[a];
            x[a] = x[b];
            x[b] = t;
      }

        public  static  void  main(String[] args) {
            String[] strs = getStrings(10);
            String[] aux = strs.clone();
              long  begin = System.currentTimeMillis();
             mergeSort(strs, aux, 0, strs. length );
            System.  out .println(System.currentTimeMillis() - begin);
            System.  out .println(Arrays.asList(strs));
            System.  out .println(Arrays.asList(aux));
      }
}
将插入排序放入并归排序中:
public  class  ArraysSort {
        /**
        *  排序的代码
        *  @param  src
        *  @param  dest
        *  @param  low
        *  @param  high
        */
        @SuppressWarnings ( "unchecked"  )
        public  static  void  mergeSort(Comparable[] src, Comparable[] dest,  int  low,  int  high) {
              if  (high - low < 7) {
                    for  ( int  i = low; i < high; i++) {
                          for  ( int  j = i; j > low; j--) {
                                if  (dest[j].compareTo(dest[j - 1]) < 0) {
                                     swap(dest, j, j - 1);
                              }
                        }
                  }
                    return ;
            }
              int  mid = ( low + high ) >> 1;
             mergeSort(dest, src, low, mid);
             mergeSort(dest, src, mid, high);
              for  ( int  i = low, p = low, q = mid; i < high; i++) {
                    if  (q == high|| (p != mid &&  src[p].compareTo(src[q]) < 0)) {
                        dest[i] = src[p++];
                  }  else  {
                        dest[i] = src[q++];
                  }
            }
      }
        /**
        *  数组置换位置
        *  @param  x
        *  @param  a
        *  @param  b
        */
        private  static  void  swap(Object[] x,  int  a,  int  b) {
            Object t = x[a];
            x[a] = x[b];
            x[b] = t;
      }
        /**
        *  测试的方法
        *  @param  length
        *  @return
        */
        private  static  String[] getStrings( int  length) {
            Random random =  new  Random();
            String[] strs =  new  String[length];
              for  ( int  i = 0; i < length; i++) {
                    int  temp = random.nextInt(999);
                  strs[i] = Integer. toString(temp);
            }
              return  strs;
      }
        public  static  void  main(String[] args) {
            String[] strs = getStrings(10);
            String[] aux = strs.clone();
              long  begin = System.currentTimeMillis();
             mergeSort(strs, aux, 0, strs. length );
            System.  out .println(System.currentTimeMillis() - begin);
            System.  out .println(Arrays.asList(strs));
            System.  out .println(Arrays.asList(aux));
      }
}
Arrays的sort方法如下:
  private  static  void  mergeSort(Object[] src,  Object[] dest,  int  low,  int  high,  int  off) {
        int  length = high - low;
        // Insertion sort on smallest arrays
         if  (length <  INSERTIONSORT_THRESHOLD ) {
             for  ( int  i=low; i<high; i++)
                 for  ( int  j=i; j>low &&
                   (( Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
                    swap(dest, j, j-1);
             return ;
        }
         // Recursively sort halves of dest into src
         int  destLow  = low;
         int  destHigh = high;
        low  += off;
        high += off;
         int  mid = (low + high) >> 1;
        mergeSort(dest, src, low, mid, -off) ;
        mergeSort(dest, src, mid, high, -off) ;
         // If list is already sorted, just copy from src to dest.  This is an
         // optimization that results in faster sorts for nearly ordered lists.
         if  (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
            System. arraycopy(src, low, dest, destLow, length);
             return ;
        }
         // Merge sorted halves (now in src) into dest
         for ( int  i = destLow, p = low, q = mid; i < destHigh; i++) {
             if  (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
                dest[i] = src[p++];
             else
                dest[i] = src[q++];
        }
    }
     /**
      *  Swaps  x[a]  with  x[b].
      */
     private  static  void  swap(Object[] x,  int  a,  int  b) {
      Object t = x[a];
      x[a] = x[b];
      x[b] = t;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值