• 归并排序


    归并排序的时间复杂度:O(n log(n))

    归并排序的思想:将两个或两个以上有序的序列合并成一个大序列,一般使用2-路归并排序即将邻近的两个序列归并起来。
    图片来源于网络在这里插入图片描述

    归并排序实现方法
    1)将待排序的序列分成两份,再进行分割成为若干独立的子序列
    2)将两两相邻的序列进行归并排序
    3)合并两个序列

    Java代码的实现
    /**
    * 归并排序
    * @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];
    }
    

    /**
    * 压缩自身数组元素至原来的一半
    * @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;
    	
    }
    

    }

    /**
    * 入参是两个有序的由小到大的数组
    * @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];
    			// startArr2 += 1;
    			 insertIndex += 1;
    		 }
    	 }else {
    		 for( int k = startArr1; k < arr1.length; k++ ) {
    			 result[insertIndex] = arr1[startArr1];
    			 startArr1 += 1;
    			 insertIndex += 1;
    		 }
    	 }
    	 
    	 return result;
    	
    }```
    

    提示
    建议使用for循环,使用递归不仅浪费存储空间也会造成安全隐患。

  • 相关阅读:
    修改ESMAP中的LOGO
    AppCompatActivity隐藏顶部任务栏
    Android原生开发,view标签导致RecyleView Adapter 中报错的奇葩问题
    用UPUPW做服务器,通过thinkphp5完美搭建APP后台
    hhh
    Redis 学习
    无刷新文件上传
    mongoDB 学习
    MySQL读写分离-架构
    Mysql 通用二进制包安装
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13285186.html
Copyright © 2020-2023  润新知