升序或降序数组的倒序输出

  其实数组倒序输出相对来说还是挺简单的,因为数组已经是有序的了,所以只要循环然后压入一个新数组即可。

  也许你会这样写:

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--;
        }
    }
}

 

转载于:https://www.cnblogs.com/guofan/p/6646207.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值