当前位置: 首页 > news >正文

C++算法竞赛基础语法-9

快速排序是一种高效的排序算法,由C. A. R. Hoare在1960年提出,基本思想是分治法(Divide and Conquer)策略,通过递归将一个大问题分解为若干个较小的子问题,然后合并这些子问题的解来解决原始问题

快速排序的基本步骤如下

(1) 选择基准元素(Pivot): 从数组中选择一个元素作为基准元素(pivot)

通常有三种选择方法:

1. 选择第一个元素作为基准

2. 选择最后一个元素作为基准

3.选择中间位置的元素作为基准

(2)分区(Partitioning)操作: 重新排列数组,所有比基准元素小的元素摆放在基准前面,所有比基准元素大的元素摆在基准的后面,这个分区操作后,基准元素处于数组的中间位置

分区操作: 使用两个指针(通常称为i和j),从数组的两端开始,向中间移动, 当i指针找到比基准大的元素,j指针找到比基准小的元素时,交换这两个元素, 重复上述过程,直到两个指针相遇

#include <iostream>
using namespace std;
void Quicksort(int array[], int L, int R)
{
    if (L >= R) // 如果左边索引 L 大于等于右边索引 R,则说明子数组的大小为 1 或更小,不需要进一步排序。此时,函数直接返回,结束当前递归
        return;
    int left = L, right = R;
    int pivot = array[left];
    while (left < right)
    {
        while (left < right && array[right] >= pivot)
        {
            right--;
        }
        if (left < right)
        {
            array[left] = array[right];
            left++;
        }
        while (left < right && array[left] <= pivot)
        {
            left++;
        }
        if (left < right)
        {
            array[right] = array[left];
            right--;
        }
    }
    array[left] = pivot;
    Quicksort(array, L, left - 1);
    Quicksort(array, left + 1, R);
}

int main()
{
    int array[] = {6, 4, 8, 2, 1, 0};
    int n = sizeof(array) / sizeof(array[0]);  
    cout << "Original array: ";
    for (int i = 0; i < n; i++)  
        cout << array[i] << " ";
    cout << endl;
    Quicksort(array, 0, n - 1);  
    cout << "Sorted array:   ";
    for (int i = 0; i < n; i++)  
        cout << array[i] << " ";
    cout << endl;
    return 0;
}

参数说明:

array[]:待排序的整数数组

L:当前子数组的左边界索引 

R:当前子数组的右边界索引

函数逻辑:

递归终止条件:如果 L >= R,说明子数组的大小为 1 或更小,不需要排序,直接返回

初始化:将 left 和 right 分别初始化为 L 和 R,选择 array[left] 作为基准元素 pivot

分区操作:

从右向左扫描,找到第一个小于 pivot 的元素,将其放到 left 位置,并将 left 指针右移一位

从左向右扫描,找到第一个大于 pivot 的元素,将其放到 right 位置,并将 right 指针左移一位

重复上述两个步骤,直到 left 和 right 指针相遇

放置基准元素:将基准元素 pivot 放到 left 位置

递归排序:分别对基准元素左边和右边的子数组进行递归排序

http://www.lryc.cn/news/536933.html

相关文章:

  • 国产编辑器EverEdit - 极简追梦人的福音:迷你查找
  • Flutter 异步编程利器:Future 与 Stream 深度解析
  • 数据结构 day05
  • 股票数据接口API实例代码python、JAVA等多种语言演示免费获取实时数据、历史数据、CDMA、KDJ等指标数据配有API说明文档
  • 【Map vs Set】:Java数据存储的“双子星”对决
  • ollama+langchain+deepseek本机跑通大模型
  • 03【FreeRTO队列-如何获取任务信息与队列的动静态创建】
  • vue-plugin-hiprint (vue2
  • 【后端面试总结】什么是堆,什么是栈
  • 第39周:猫狗识别 2(Tensorflow实战第九周)
  • 力扣--239.滑动窗口最大值
  • 傅里叶变换推导
  • 扣子工作流中禁止同类别的图像流节点,不能超过4个
  • Java 语言深度剖析与实践应用
  • 1.14学习总结
  • C++蓝桥杯基础篇(三)
  • 微信小程序的制作
  • Sass更新:@import——>@use
  • Python使用Flask结合DeepSeek开发
  • python中的抽象类在项目中的实际应用
  • New Game--(单调队列)
  • mapbox V3 新特性,添加下雪效果
  • 无人机遥感在农林信息提取中的实现方法与GIS融合制图教程
  • 生物发酵展与2025生物医药创新技术与应用发展论坛同期盛大举办
  • Jenkins 配置 Git Repository 五
  • 记录阿里云CDN配置
  • mapbox 从入门到精通 - 目录
  • mysql中general_log日志详解
  • 算法与数据结构:从基础到深入
  • 基于千兆5G网关的5G急救车方案