1.快速排序(双指针法)

本文详细介绍了快速排序算法的思想,包括使用分治策略,通过设置左右指针寻找枢轴元素的过程。在找到合适的枢轴后,对数组进行分割并递归地对分割后的部分进行排序。代码示例展示了C++实现的快速排序算法,该算法对给定的数列进行排序并输出结果。

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

算法思想是什么?

分治,利用指针开辟虚拟空间

算法步骤是什么?

1.选择数组中的第一个元素arr[startIndex]作为轴(pivot)

2.左指针为left,从最左边开始寻找第一个比pivot大的数

3.右指针为right,从最右面的一个元素开始向左寻找第一个小于等于pivot的数值

4.经过2,3两个步骤后,将会出现以下两种情况

​ (1):left和right没有相遇,此时进行交换,swap(arr,left,right);

​ (2):left和right相遇,做swap(arr,startIndex,left),然后返回left

5.partition中返回pivot用于分割数组,下一次用于排序的数组被分割为(startIndex,pivot-1),(pivot+1,endIndex)两段,进行递归操作

神级基础排序——快速排序 - 知乎

算法代码是什么?

#include <iostream>

using namespace std;

const int N = 100010;

int q[N];//开辟数列空间

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;//排除只有一个数或没有数的情况

    int i = l - 1, j = r + 1;//因为后面是i++和j++,所以开头就要向外扩展一格
    int x = q[l + r >> 1];//比特操作,取数列中间的数为pivot

    while (i < j)
    {
        do i ++ ; while (q[i] < x);//直到i对应的数大于x才停止
        do j -- ; while (q[j] > x);//直到j对应的数小于j才停止
        if (i < j) swap(q[i], q[j]);//如果没有相遇就交换
    }

    quick_sort(q, l, j);//递归左右处理两端
    quick_sort(q, j + 1, r);
}

int main()
{
    int n;
    scanf("%d", &n);//明确数列数的个数

    for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);//输入待排列的数组

    quick_sort(q, 0, n - 1);//带入快排函数

    for (int i = 0; i < n; i ++ ) printf("%d ", q[i]);//打印出排列好的数组

    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值