算法之归并排序


/**

 * 专门用于进行排序,里面包含各种排序方法

 * @author 

 *

 */

public class SortClass {

 归并排序

    * @return

    */

   public static int[] guiBing( int[] arr ) {

     int[][] arry = new int[arr.length][1];

     //将一维数组变成二维数组

     for(int i = 0; i < arr.length; i++){

        arry[i] = new int[] { arr[i] };

     }

     //合并有序数组到一个为止

     int[][] arr3 = arry;

     for(;;) {

        if( arr3.length > 1 ) {

           arr3 = SortClass.getHalf(arr3);

        }else {

           break;

        }

     }

     return arr3[0];

   }
   /**

    * 入参是两个有序的由小到大的数组

    * @param arr1

    * @param arr2

    * @return 返回由小到大的有序数组

    */

   public static int[] mergeArr(int[] arr1, int[] arr2) {

      int[] result = new int[ arr1.length + arr2.length ];

      int startArr1 = 0;

      int startArr2 = 0;

      int insertIndex = 0;

      for( ; ;) {

         if( startArr1 > arr1.length - 1 ||  startArr2 > arr2.length - 1 ) {

            break;

         }
         if( arr1[startArr1] <= arr2[startArr2] ) {

            result[insertIndex] = arr1[startArr1];

            startArr1 += 1;
         }else {

            result[insertIndex] = arr2[startArr2];

            startArr2 += 1;

         }

         insertIndex += 1;

      }
   

      if( startArr1 > arr1.length - 1 ) {

         for( int k = startArr2; k < arr2.length; k++ ) {

            result[insertIndex] = arr2[k];

            insertIndex += 1;

         }

      }else {

         for( int k = startArr1; k < arr1.length; k++ ) {

            result[insertIndex] = arr1[k];

            insertIndex += 1;

         }

      }

      return result;

   }

   /**

    * 压缩自身数组元素至原来的一半

    * @return

    */

   public static int[][] getHalf(int[][] arr) {

     int[][] result;

     if( arr.length % 2 == 1 ) {

        result = new int[ arr.length / 2 + 1][];

     }else {

        result = new int[ arr.length / 2][];

     }

     
     for( int i = 0; i < result.length; i++) {

        if( (i * 2 + 1) >= arr.length ) {
    
           result[i] = mergeArr(arr[i*2],new int[] {});

        }else {

           result[i] = mergeArr(arr[i*2],arr[i*2 + 1]);
           
        }

     }
  
     return result;

   }

   public void insertSort(int [] a){

     int insertIndex = 0;

     int j = 0;

     for(int i = 1;i<a.length;i++) {

        insertIndex = a[i];

        j = i-1;

        while(j>0&&a[j]>insertIndex) {

           a[j+1] = a[j];

           j--;

        }

        a[j+1] = insertIndex;   

     }

   }

}

此算法的时间复杂度是(n*logn)

归并排序先将整个数组进行分组,每次分组后组的个数都少一半
所以分组的次数就是log2n然后进行两组合并排序这个时间复杂度是
n

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值