常见的排序方法(javascript)

冒泡排序

重复的走访过要排序的数列,一次比较两个元素,如果顺序错误就交换过来。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

let arr = [3,12,5,8,19,21,1,15];
for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j<arr.length - 1 - i; j++){
        if (arr[j] > arr[j+1]) {
            let temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;
        }
    }
}   

步骤:
最外层的循环次数和数组长度相等。第一次循环,所有项两两对比,数组中最大的数字被放到最后。
第一次比较结果:

[3,12,5,8,19,1,15,21];

因为最大数字被选出,所以最后一个数字不用进入比较,第二轮,从第一项比较到倒数第二项。
第二次比较结果:

[3,12,5,8,1,15,19,21];

以此类推比较到最后得出结果。
因为每次比较都能把最大的移到后面,所以内层的循环每次都减去i,因为i等于进行了几次比较,已经有多少确定的数字被移动到了最后。


插入排序

对于未排列数据,在已排序序列中从后向前扫描,找到相应的位置并插入。

let arr = [3,12,5,8,19,21,1,15];
for (let i = 1; i < arr.length; i++){
    for (let j = 0; j < i; j++){
        if(arr[j] > arr[i]){
            arr.splice(j, 0, arr[i]);
            arr.splice(i+1, 1);
        }
    }
}

步骤:
最外层循环次数和数组长度相同。i=1时,内层循环进行1次,即j为0,第一项和第二项比较,如果第一项大于第二项,在j的位置,即第一项的位置插入i的数字,即第二项,再删除i位置本身的数字。
i=2时,第一项,第二项都与第三项比较,比第三项大就执行操作。
第二项大于第三项:

//先插入元素
[3,5,12,5,8,19,21,1,15] 
//再删除元素
[3,5,12,8,19,21,1,15] 

后面以此类推,每一层循环,都把最大的往后换。
我觉得这个就是把后面的数据,一个个去对比放到前面的哪个位置比较好,再进行替换。


快速排序

通过一次排序将要排序的数据分割成两部分,左边的部分小于右边的部分,再按此方法继续排序。

Array.prototype.quick_sort = function() {
    var len = this.length; 
    if(len <= 1){
        return this.slice(0);
    }
    var left = [];
    var right = [];
    var mid = [this[0]];
    for (var i = 1; i < len; i++) {
        if (this[i] < mid[0]){
            left.push(this[i]);
        }else{
            right.push(this[i]);
        }
    }
        return left.quick_sort().concat(mid.concat(right.quick_sort()));
}
let arr = [3,5,12,8,19,21,1,15];
arr = arr.quick_sort(); 

步骤:
将数组的第一项作为基准项,所有比基准项小的排在左边,比基准项大的排在右边。此时left为[1],right为[5,12,8,19,21,15];
left因为长度为1,所以必定为最小的,此时left不需要再执行排序。
right中第一项为5,其余的都排到right数组中。此时right为[12,8,19,21,15];
以此类推。

(后续再补充~) (≡ω≡.)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值