把某个数字放到最后面解法以及快排

把数组中的某个数字移到数组最后面,比如[1, 7, 0, 2, 7, 0, 4, 5]中,把7往后挪,结果为[ 1, 0, 2, 0, 4, 5, 7, 7 ]
不想看文字就再刷一下大佬视频:https://www.bilibili.com/video/av3884468

做法一:

利用一个count计数,看碰到了几个x。如果碰到的数不是x,那么就把这个数往前挪count个单位,即
arr[i - count] = arr[i]; ,相等count++
下面这张图是整个移动过程:移动所有0,zeros用来统计碰到有多少个0。
在这里插入图片描述

/**
 * 所有相同数字后移——假设现在数字为x
 * @authors heye (heye1109@qq.com)
 * @date    2019-04-01 17:05:10
 * @version $Id$
 */

function putBack(arr, x) {
    var len = arr.length;
    var count = 0;

    for (var i = 0; i < arr.length; i++) {
        if (arr[i] === x) {
            count++;
        } else {
            arr[i - count] = arr[i];
        }
    }
    while (count > 0) {
        arr[len - count] = x;
        count--;
    }
    console.log(arr);

}
putBack([1, 7, 0, 2, 7, 0, 4, 5], 7);
//[ 1, 0, 2, 0, 4, 5, 7, 7 ]

做法二:

在这里插入图片描述

//根据这个思想,写了下面这个代码,假设指定数字是X
function backShift(arr, x) {
    var len = arr.length;
    //i指向没有访问过的位置,j指向x区域的开始位置
    var index = arr.indexOf(x);
    var [i, j] = [index + 1, index];

    while (i < len) {
        if (arr[i] !== x) {
            arr[j] = arr[i];
            i++;
            j++;
        } else {
            i++;
        }
    }
    //把最后j指向位置一直到数组最后写成x
    while (j < len) {
        arr[j++] = x;

    }
    console.log(arr);
}
backShift([1, 7, 0, 2, 7, 0, 4, 5], 7);

然而、大佬的代码是这样的:

//第二种思想的第二种写法
function backShift2(arr, x) {
    var len = arr.length;
    //i指向没有访问过的位置,j指向x区域的开始位置
    var j = 0;
    for (var i = 0; i < len; i++) {
    	//不同时交换数据并j++、i++,相同时i++
        if (arr[i] !== x) {
            [arr[i], arr[j]] = [arr[j], arr[i]];
            j++;
        }
    }
    while (j < len) {
        arr[j++] = x;
    }
    console.log(arr);
}
backShift2([1, 7, 0, 2, 7, 0, 4, 5], 7);

快速排序

/*
快速排序:小于基准k的放左边,大于k的放右边
这样跟上面的思想是一样的。然后用上面这种方式做,稍微改一下
第一段:小于x的;
第二段:大于X的;
第三段: 没有访问的;
*/
function partition(arr, L, R) {
	//利用最后一个值作为key
    var key = arr[R];
    //i指向没有访问过的位置,j指向x区域的开始位置
    var j = L;
    for (var i = L; i < R; i++) {
        //小于精准值的放到第一段,大于等于的放第二段
        if (arr[i] < key) {
            [arr[i], arr[j]] = [arr[j], arr[i]];
            j++;
        }
    }
    //把键值放到j的位置
    [arr[R], arr[j]] = [arr[j], arr[R]];
    return j;
}

function QuickSort(arr, L, R, str) {
 
    if (L < R) {
        var mid = partition(arr, L, R);
        QuickSort(arr, L, mid - 1); //左边部分接着排
        QuickSort(arr, mid + 1, R); //右边部分接着排
    }
}
var arr = [7, 3, 5, 2, 1, 8];
QuickSort(arr, 0, 5);
console.log(arr);
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值