快排算法是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快排算法是啥意思?相关的知识,希望对你有一定的参考价值。

快速排序,外文名Quicksort,计算机科学,适用领域Pascal,c++等语言,是对冒泡排序算法的一种改进。

原理:

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。

性能分析:

快速排序的一次划分算法从两头交替搜索,直到low和hight重合,因此其时间复杂度是O(n);而整个快速排序算法的时间复杂度与划分的趟数有关。

理想的情况是,每次划分所选择的中间数恰好将当前序列几乎等分,经过log2n趟划分,便可得到长度为1的子表。这样,整个算法的时间复杂度为O(nlog2n)。

以上内容参考:百度百科——快排算法

参考技术A

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


然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。 

重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:

(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。

(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

void QSort(SeqList L,int low,int high)改成void QSort(SeqList &L,int low,int high),加个&。

假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。

1、设置两个变量I、J,排序开始的时候I:=1,J:=N;

2、以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

3、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

4、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

5、重复第3、4步,直到I=J。

原理

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

JavaScript实现快速排序算法

JavaScript实现经典排序算法—快排
快速排序算法的性能比之前的冒泡、选择排序都要好,和归并排序一样,是一个可以用于实战的算法,听说chrome用的就是快排
又听说前端面试会考,那你实现一个快排吧!

一、快速排序的算法思路

还是在这里看一下快排是啥意思
快速排序算法动图
1、快速排序的特点就是随机设置一个基准点,比如是数组的第一个元素,然后数组的其他元素就跟这个基准线进行对比,比基准线大的放在左边,比基准线小的放在右边
2、再设置一个基准线,再这样小的放左边,大的放右边,递归。

二、编码实现

详细分析写在注释里了

Array.prototype.quickSort = function() {
    const rec = (arr) => {
        // 递归都是要有尽头的,不然会无限进行下去
        // 直到Maximum call stack size exceeded
        // 别问我为什么知道
        // 而且注意,这里要有小于1,不然也会报错
        if(arr.length <= 1) return arr;
        let left = [];
        let right = [];
        const base = arr[0];
        // 因为基准线是arr[0],所以从下标是1也就是第二个开始
        for(let i = 1; i < arr.length; i += 1) {
            if(arr[i] < base) {
                left.push(arr[i])
            } else {
                right.push(arr[i])
            }
        }
        // 解构一下
        // 递归左边数组和右边数组
        // 左边加上右边加上基准才是完整数组哈
        return [...rec(left), base, ...rec(right)];
    }
    const res = rec(this);
    // 遍历res,赋值到this也就是当前数组本身
    res.forEach((item, key) => {
        this[key] = item;
    })
}

const arr = [1, 5, 9, 3, 18, 6, 2, 7]
arr.quickSort()
console.log(arr);

三、算法时间复杂度

1、这种劈成两半递归,时间复杂度一般是O(logn)
2、递归里面,for循环对比,时间复杂度是O(n)
所以时间复杂度是O(nlogn)

写完了,唉嘿~看完点赞的都是小可爱大聪明

以上是关于快排算法是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

常用算法之 冒泡选择插入快排

C语言快排

排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)

排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)

排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)

美团面试:请手写一个快排,被我怼了!