排序算法之快速排序quickSort

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

它的基本思想是:通过一次排序将数据分割成两部分,其中一部分的数据都比另外一部分的数据都要小,然后在对这两部分进行相同操作

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

动态演示

在这里插入图片描述

python实现

def quickSort(datas: list):
    def func(begin: int, end: int):
        if begin == end or begin == end + 1: return
        front: int = begin
        rear: int = end
        pivot = datas[front]
        while front < rear:
            while front < rear and datas[rear] >= pivot: rear -= 1
            datas[front] = datas[rear]
            while front < rear and datas[front] <= pivot: front += 1
            datas[rear] = datas[front]
        datas[front] = pivot
        func(begin, front)
        func(front + 1, end)
        
    func(0, len(datas) - 1)
def main():
    size: int = 20
    l = []
    for i in range(0, size):
        l.append(math.floor(random() * size * 10))
    print("排序前:", l)
    quickSort(l)
    print("排序后:", l)

在这里插入图片描述

数据量10^410^510^610^7
耗时/ms43.2601.17179.987891.9

C++ 实现

    template<typename T>
    void quickSort(T* arr, int size) {
        if (size == 0)return;
        int front = 0, rear = size - 1;
        T pivot = arr[0];
        while (front < rear) {
            while (front < rear && arr[rear] >= pivot) { --rear; }
            arr[front] = arr[rear];
            while (front < rear && arr[front] <= pivot) { ++front; }
            arr[rear] = arr[front];
        }
        arr[front] = pivot;
        quickSort(arr, front);
        quickSort(arr + front + 1, size - 1 - front);
    }
数据量10^410^510^610^7
耗时/ms0.839710.713133.0323680.29

java实现

    public static <T extends Comparable<T>> void quickSort(T[] array) {
        _quickSort(array, 0, array.length - 1);
    }

    private static <T extends Comparable<T>> void _quickSort(T[] array, int begin, int end) {
        if (begin == end + 1 || begin == end) return;
        int front = begin, rear = end;
        T pivot = array[front];
        while (front < rear) {
            while (front < rear && array[rear].compareTo(pivot) >= 0) --rear;
            array[front] = array[rear];
            while (front < rear && array[front].compareTo(pivot) <= 0) ++front;
            array[rear] = array[front];
        }
        array[front] = pivot;
        _quickSort(array, begin, front - 1);
        _quickSort(array, front + 1, end);
    }
数据量10^410^510^610^7
耗时/ms4.0115.3440.54059.8

算法分析

平均时间复杂度 O(nlogn)
最坏时间复杂度 O(n²) 对一个降序序列排序,退化成冒泡排序
稳定性:不稳定

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值