快速排序——排序算法


前言

双休真是幸福,大小周目前对我实习来说还好,多上一天多一天的工资,如果毕业了除非能去大厂不然真不想大小周,不说别的,转正周六也算加班吧,居然没有加班工资,程序员内卷也太厉害了,其实我也算一员吧,没想到刚才步入社会,就被按在地上摩擦,还好目前加班不算严重,不然真裂开了,哈哈哈,不说了今天继续更新排序算法——快速排序。


一、什么是快速排序?

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
个人对于快排的理解感觉有点像分治算法,首先确定一个基准值,然后将依据基准值,将数组分为两个小组,小于基准值的部分和大于基准值的部分,随后再将两个序列继续用同样的方法不断分解排序,最后直到不可再分,即设置的数组无法再分,然后所有序列都有序,整个数组的顺序也就一致了。

二、算法描述

算法步骤:

  1. 先从数列中取出一个数作为基准数。
  2. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  3. 再对左右区间重复第二步,直到各区间只有一个数。

算法复杂度:

  • 时间复杂度:
    • 最好:O(nlog2n)
    • 最坏:O(n2)
    • 平均: O(nlog2n)
  • 空间复杂度:O(nlog2n)
  • 稳定性:不稳定

三、JS代码实现

下面是JS代码示例,可以在node环境运行代码,查看结果。

代码如下(示例):

function quickSort(ary, left, right) {
    let len = ary.length, partitionIndex;
    left = typeof left != 'number' ? 0 : left;
    right = typeof right != 'number' ? len - 1 : right;

    if (left < right) {
        partitionIndex = partition(ary, left, right);
        quickSort(ary, left, partitionIndex - 1);
        quickSort(ary, partitionIndex + 1, right);
    }
    return ary;
}
//分区
function partition(ary, left, right) {
    let privot = left;  //基准值
    let index = privot + 1;  //小于基准的指针索引
    for (let i = index; i <= right; i++) {
        if (ary[i] < ary[privot]) {
            [ary[i], ary[index]] = [ary[index], ary[i]];
            index++;
        }
    }
    [ary[privot], ary[index - 1]] = [ary[index - 1], ary[privot]];
    return index - 1
}
var arr = [9, 8, 7, 3, 2, 1, 6, 5, 4, 0];
console.log(quickSort(arr));

运行结果图:
快速排序截图


总结

感觉排序这一部分算法解释的不太详细,可能不适合当做学习排序算法博客,当初决定写排序算法的文章,本着是为了让自己学习十大排序算法(ps: 其实我是写一篇博客,去了解一个排序算法),也是为了自己以后复盘,但是觉得写得还是不太详尽,个人看算法其实也是读程序加看步骤自己理解思想,然后多看看几篇博客。总之,进入程序员这个行业,想要随着年限让自己的身价水涨船高,就是要不断的学习,构建自己的知识体系,基础要扎实,框架也要熟练,不学习就会被淘汰,所以加油吧!各位打工人!哈哈哈。

—— 2021-1-24 22:04 这周好像拖延没那么严重了,加油!

今日份励志名言:

“学习的敌人是自己的满足,要认真学习一点东西,必须从不自满开始!”
—— 毛主席

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZERO丶X

托马斯回旋360°飞旋感谢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值