suc-浮生

----------“浮于华,生不惜”

博客园 首页 联系 订阅 管理

一、学习借鉴

引:上一篇文章中在合并俩数组时用到了好几个for循环,因此大大增加了时间复杂度,于是找了好多关于这方面的算法。

请看下面事例:

 整个过程中用到的原理都在注释中。

public static void find(){
        int[] arr1={1,3,5};
        int[] arr2={2,4,6};
        /*
         * [1 3 5]  [2 4 6]-----0 1 2(索引)
         *  0 1 2    0 1 2
         *  m=3    n=3
         *  arr1[0]<arr2[0]----成立---arr[]=[1,0,0,0,0,0]  i++=1
         *  arr1[1]<arr2[0]---不成立--arr[]=[1,2,0,0,0,0]  j++=1
         *  arr1[1]<arr2[1]---成立----arr[]=[1,2,3,0,0,0]  i++=2
         *  arr1[2]<arr2[1]---不成立--arr[]=[1,2,3,4,0,0]  j++=2
         *  arr1[2]<arr2[2]---成立----arr[]=[1,2,3,4,5,0]  i++=3=m--结束while
         * 
         */
             int m=arr1.length;
            int n=arr2.length;
            int N=m+n;
            int[] arr=new int[N];//创建新数组--存合并后的数
            int i=0,j=0,k=0;
            while (i<m&&j<n){
                    
                if (arr1[i]<arr2[j]){//如果从0开始,arr1中的数小于arr2中的数,则将数存在arr中  
                    arr[k++]=arr1[i++];
                }else{
                    arr[k++]=arr2[j++];
                }
            }
          /*  
           * 继续判断  因为i或者j某一个超过m或者n就退出了while但是数组元素并没有全部存在arr中
           * i=3不再继续  j=2<n=3继续
           */
            while (i<m) arr[k++]=arr1[i++];
            while (j<n) arr[k++]=arr2[j++];
        System.out.println(Arrays.toString(arr));

结果:

[1, 2, 3, 4, 5, 6]

 

二、第一篇文章算法优化(java内部自带函数)

Arrays.sort(nums);//对数组自动从小到大排序,因此避免了排序算法带来的过高时间复杂度

  等价代码:

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

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

                if (nums[i] >=  nums[j]) {
                    int temp =  nums[i];
                    nums[i] = nums[j];
                    nums[j] = temp;
                }
            }
        }

很明显嵌套for循环时间复杂度更大

posted on 2018-04-16 12:34  suc-浮生  阅读(1354)  评论(0编辑  收藏  举报