兩順序數組---合並---重新排序【時間復雜度小】


一、學習借鑒

引:上一篇文章中在合並倆數組時用到了好幾個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循環時間復雜度更大


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM