标签:war while 理解 pre 它的 else oba null span
其实数组倒序输出相对来说还是挺简单的,因为数组已经是有序的了,所以只要循环然后压入一个新数组即可。
也许你会这样写:
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--; } } }
标签:war while 理解 pre 它的 else oba null span
原文地址:http://www.cnblogs.com/guofan/p/6646207.html