快速排序算法

快速排序是对冒泡排序的一种改进。

通过一趟排序将要排序的数据分割成独立的左右两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,另一部分则相反;然后再按此方法对这两部分数据分别进行快速排序,整个排序过程递归进行。(假设基数为n,比基数小的为left,比基数大的为right;即left,n,right)

快速排序,用到的方式很多;

比如:

1.取第一个作为基数开始顺序进行;

2.取第一个作为基数开始,顺序(数组第一个开始往后找)和逆向进行(数组最后一个往前找);

3.随机取一个作为基数开始。

4.取中间值作为基数开始。

等等。。。

我们看上面动图中可知,我们是取中间的一个数作为基数进行处理,则有如下代码:

function quickSort(arr){
    let len = arr.length;
    //递归需要有一个出口,即只有一个时就不必再交换位置,为自己本身,此时结束
    if (len <= 1){
        return arr;
    };
    let leftArr = [];
    let rightArr = [];
    let mid = Math.floor(len / 2); // 中间基数
    let i = 0;
    while (i < len) {
        if (i === mid) {
            i++;
            continue;
        };
        if (arr[i] < arr[mid]) {
            leftArr.push(arr[i])
        } else {
            rightArr.push(arr[i])
        }
        i++;

    }
    return [...quickSort(leftArr), arr[mid], ...quickSort(rightArr)]
}
console.log(quickSort([4,3,5,8,1]));

从上面代码我们可以得知,当初始排序数据随机分布,使每次分成的两个子区间中的元素个数大致相等时,递归树高度为log2n,快速排序呈现最好情况,即最坏情况下的时间复杂度为nlog2n;即时间复杂度为log2n~nlog2n。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值