ACM基础(四):排序之快速排序


一、伪代码

快速排序,也是分治法。

1.PATITION

在这里插入图片描述
意义:就是通过pivot将数组分成两部分,前面的一部分小于等于pivot,后面的一部分大于pivot。

将倒数第一作为 轴 pivot

建立两个哨i(开始再往前一个)(i+1表示大于pivot的元素)、j(遍历的、从开始到倒数第二)(表示当前小于等于pivot的元素)

遍历j:如果元素A[j]小于等于轴A[r],将i加一,并且交换A[i]和A[j](或者说交换A[++i]和A[j])。作用就是将小于等于pivot的和大于pivot的交换。

最后交换A[i+1]和A[r],即将pivot交换到前部分中。

返回i+1,即pivot的下标
在这里插入图片描述

PS:妙,交换次数更少

2.quickSort

在这里插入图片描述
先校验

PARTITION返回个下标q(pivot的下标,之前的是小于等于它的,之后的是大于它的)

用q来分,QUICKSORT(A,p,q-1)

QUICKSORT(A,q+1,r)

PS:妙啊,q都不动

二、C++实现

#include <iostream>
using namespace std;

// 数组A部分,下标[p,r]
int PARTITION(int A[], int p, int r)
{
    // 将倒数第一作为 轴 pivot
    int pivot = A[r];
    // 哨i,开始再往前一个:i+1表示大于pivot的元素
    int i = p - 1;
    // 哨j,从开始到倒数第二:表示当前小于等于pivot的元素
    for (int j = p; j <= r - 1; j++)
    {
        // 元素A[j]小于等于轴A[r]
        if (A[j] <= pivot)
        {
            // 将大于pivot的和小于等于pivot的交换。
            swap(A[++i], A[j]);
        }
    }
    // 将pivot交换到前部分中
    swap(A[i + 1], A[r]);
    // pivot的下标
    return i + 1;
}

// 排序数组A,下标[p,r]
void quickSort(int A[], int p, int r)
{
    // 校验
    if (p < r)
    {
        // pivot的下标,之前的是小于等于它的,之后的是大于它的
        int q = PARTITION(A, p, r);
        // q都不动
        quickSort(A, p, q - 1);
        quickSort(A, q + 1, r);
    }
}

int main()
{
    int A[] = {8, 4, 5, 7, 1, 3, 6, 2};
    int length = sizeof(A) / sizeof(int);
    quickSort(A, 0, length - 1);
    for (int i = 0; i < length; i++)
    {
        cout << A[i] << ' ';
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值