快速排序

前言

最近阮老师的快速排序算法被怼了。。。我之前看过觉得挺不错的,简单易懂,一直拿来作为自己的快速排序方法。

快排

赶紧实现一下

// 交换函数
function swap(myArray, p1, p2) {
    var temp = myArray[p1];
    myArray[p1] = myArray[p2];
    myArray[p2] = temp;
}

function position(myArray, left, right){
    var pivot = myArray[right];  // 以最右边的数为基准进行排序,小的放左边,大的放右边
    var tail = left - 1; 

    for(var i = left; i < right; i++) {
        if(myArray[i] < pivot) {
            tail++;
            swap(myArray, tail, i);
        }
    }
    swap(myArray, tail+1, right);  
                      
    return tail+1;
}

function quickSort(myArray, left, right) { 
    if(myArray.length < 2){
        return myArray;
    }

    // 如果函数没有输入left和right值
    left = (typeof left !== "number" ? 0 : left);
    right = (typeof right !== "number" ? myArray.length-1 : right);

    var index = position(myArray, left, right);

    if(left < index - 1) {
        quickSort(myArray, left, index - 1);
    }

    if(index < right) {
        quickSort(myArray, index + 1, right);
    }


    return myArray;
}

测试一下:

var arr = [];

// 生成随机整数
function random(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

// 生成len长度的随机数组
function generateArr(len) {
  for (var i = 0; i < len; i++) {
    arr.push(random(1, len));
  }
}

generateArr(10000000);
console.time('xm');
quickSort(arr);
console.timeEnd('xm'); // xm: 1633.260986328125ms

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值