快速排序(Quick Sort)算法原理及实现

本文介绍了快速排序的原理,通过选择基准值,将数组分为两部分,使得基准值左侧的元素小于右侧的元素。在平均情况下,快速排序的时间复杂度为O(n log n),最坏情况为O(n^2)。文章还提供了一个C++代码示例来演示排序过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考快速排序
原理:在数列里面找到一个基准值,凡是比这个基准值大的都移动到它前面(假设升序排列),比它大的移动到后面。这样就找到了这个基准值应该在的位置。同理,对基准值左右两侧的数列进行同样处理,直到排序完成。
平均时间复杂度为 O ( n   l o g   n ) O(n\ log\ n ) O(n log n),在最糟的情况下需要 O ( n 2 ) O(n^2) O(n2)
举例:
在这里插入图片描述
选取6作为基准值,确定6在数列中的位置
在这里插入图片描述
用两个指针分别指向左端和右端(left, right)。刚开始,让右端right移动,直到right指向的值小于基准值6,也就是4的位置;而后left移动,直到left指向的值大于6,即10的位置,之后两个值交换
在这里插入图片描述
之后继续按上述规则移动
在这里插入图片描述
交换两个值
在这里插入图片描述
直到right = left + 1
在这里插入图片描述
然后交换基准值和此时left位置的值,这时候基准值的位置就是其在序列中应在的位置
在这里插入图片描述
然后对基准值左右两侧的子序列进行同样的操作,直到排序完成。

参考代码

def swap(arr, i, j):
    temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp


def Quick_Sort(arr, left, right):

    if left > right:
        return
    base = arr[left]
    [left_t, right_t] = [left, right]

    while left_t < right_t:
		#移动右侧指针
        while arr[right_t] >= base and right_t > left_t:
            right_t = right_t - 1
        #移动左侧指针
        while arr[left_t] <= base and right_t > left_t:
            left_t = left_t + 1

        swap(arr, left_t, right_t)

    swap(arr, left, left_t)
    #两侧子序列递归
    Quick_Sort(arr, left, left_t - 1)
    Quick_Sort(arr, right_t + 1, right)
    

测试

arr = [10, 2, 5, 9, 15, 21, 13, 0, 19, 27, 16]

if __name__ == '__main__':
    Quick_Sort(arr, 0, len(arr) - 1)
    print(arr)

C++

void Quick_sort(int arr[], int left, int right)
{
    int mid = left;

    for (int i = left; i < right; i++)
    {
        if (arr[i] < arr[right])
        {
            std::swap(arr[i], arr[mid]);
            mid ++;
        }
    }
    std::swap(arr[right], arr[mid]);

    if (mid > left + 1)
    {
        Quick_sort(arr, left, mid - 1);
    }

    if (mid < right - 1)
    {
        Quick_sort(arr, mid + 1, right);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值