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