前言
双休真是幸福,大小周目前对我实习来说还好,多上一天多一天的工资,如果毕业了除非能去大厂不然真不想大小周,不说别的,转正周六也算加班吧,居然没有加班工资,程序员内卷也太厉害了,其实我也算一员吧,没想到刚才步入社会,就被按在地上摩擦,还好目前加班不算严重,不然真裂开了,哈哈哈,不说了今天继续更新排序算法——快速排序。
一、什么是快速排序?
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
个人对于快排的理解感觉有点像分治算法,首先确定一个基准值,然后将依据基准值,将数组分为两个小组,小于基准值的部分和大于基准值的部分,随后再将两个序列继续用同样的方法不断分解排序,最后直到不可再分,即设置的数组无法再分,然后所有序列都有序,整个数组的顺序也就一致了。
二、算法描述
算法步骤:
- 先从数列中取出一个数作为基准数。
- 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 再对左右区间重复第二步,直到各区间只有一个数。
算法复杂度:
- 时间复杂度:
- 最好: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 这周好像拖延没那么严重了,加油!
今日份励志名言:
“学习的敌人是自己的满足,要认真学习一点东西,必须从不自满开始!”
—— 毛主席