其實數組倒序輸出相對來說還是挺簡單的,因為數組已經是有序的了,所以只要循環然后壓入一個新數組即可。
也許你會這樣寫:
function backSort (arr) { var finalArr = []; for (var i = arr.length - 1; i >= 0; i --) { finalArr.push(arr[i]); } return finalArr; } console.log(backSort([1,2,3,4,5]));
而沒有對數組這種push操作的java,可以這樣寫:
public void backSort () { finalArr = new int[0]; for(int i = numArr.length - 1; i >= 0; i --) { finalArr = joinNewArr(finalArr, numArr[i]); } numArr = finalArr; finalArr = null; } public int[] joinNewArr (int[] arr, int num) { int[] midArr = new int[arr.length + 1]; if(arr.length == 0) { midArr[0] = num; }else { System.arraycopy(arr, 0, midArr, 0, arr.length); midArr[midArr.length - 1] = num; } return midArr; }
思路無非都是從后向前循環,然后壓入新數組打印出來。這是正確的!
然而通過昨天對快速排序的剖析,我們理解了它的思想:每次循環都通過對首尾兩個方向同時進行一次檢查。這意味着你一次循環檢查首尾兩個值,對於循環需要的此數就此減半了有木有,大大提高了效率~
所以我們引進這種思想,對於這種有序數組的倒敘輸出能減少近一半的循環次數,很美妙!
快來感受一下吧:
function quickToBackSort (arr) { var firstSub = 0; var lastSub = arr.length - 1; while(firstSub < lastSub){ arr[firstSub] = arr[firstSub] + arr[lastSub]; arr[lastSub] = arr[firstSub] - arr[lastSub]; arr[firstSub] = arr[firstSub] - arr[lastSub]; firstSub++; lastSub--; } return arr; }
而且對於java來說,不用頻繁的創建新數組,程序運行步驟直接減少巨多有木有啊!
public void quickBackSort () { int firstSub = 0; int lastSub = numArr.length - 1; while(firstSub < lastSub) { while(firstSub < lastSub){ numArr[firstSub] = numArr[firstSub] + numArr[lastSub]; numArr[lastSub] = numArr[firstSub] - numArr[lastSub]; numArr[firstSub] = numArr[firstSub] - numArr[lastSub]; firstSub++; lastSub--; } } }
