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

快速排序算法讲解(c基础)

一、快速排序的基本原理

快速排序是一种基于分治策略的高效排序算法。它的基本思想是:

选择一个基准元素(pivot),通过一趟排序将待排序序列分割成两部分,其中一部分的所有元素都比基准元素小,另一部分的所有元素都比基准元素大。然后,分别对这两部分继续进行快速排序,直到整个序列都有序。

二、快速排序的具体实现步骤

1. 选择基准元素

通常可以选择待排序序列中的第一个元素、最后一个元素或者中间元素等作为基准元素。在示例代码中,我们常选取待排序数组的最后一个元素作为基准元素,例如:

隐藏过程

c

复制

int pivot = arr[high];
2. 划分操作(Partition)

这是快速排序的关键步骤,目的是通过比较和交换元素,将数组划分为两部分,使得左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素。

具体实现过程如下:

  • 设置两个指针,一个指针 i 初始指向待排序序列的第一个元素的前一个位置(即 low - 1),另一个指针 j 从待排序序列的第一个元素(即 low)开始。

展开过程

  • 遍历数组,比较每个元素与基准元素的大小关系。当 j 指向的元素小于基准元素时,将 i 指针先向前移动一位(因为 i 初始位置在第一个元素之前),然后交换 i 和 j 所指向的元素。

展开过程

  • 遍历完整个数组(除了基准元素本身,因为基准元素在最后一个位置,前面的循环到 high - 1 就结束了)后,将基准元素与 i + 1 位置的元素进行交换。这样就完成了一次划分操作,使得基准元素处于正确的位置,左边的元素都小于它,右边的元素都大于它。

展开过程

3. 递归排序

完成一次划分操作后,得到了基准元素的正确位置(假设为 pi),此时数组被分成了两部分:arr[low] 到 arr[pi - 1] 和 arr[pi + 1] 到 arr[high]。然后分别对这两部分递归地调用快速排序函数,直到整个数组都有序。

隐藏过程

c

复制

if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);
}

三、快速排序的代码示例

以下是完整的快速排序 C 语言代码示例,包含了交换函数 swap、划分函数 partition 和快速排序主函数 quickSort

隐藏过程

c

复制

#include <stdio.h>// 交换两个整数的函数
void swap(int *a, int *b) {int t = *a;*a = *b;*b = t;
}// 划分函数,将数组划分为两部分
int partition(int arr[], int low, int high) {int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high - 1; j++) {if (arr[j] < pivot) {i++;swap(&arr[i], &arr[j]);}}swap(&arr[i + 1], &arr[high]);return (i + 1);
}// 快速排序主函数
void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, high, pi + 1);}
}int main() {int arr[] = {5, 4, 3, 2, 1};int n = sizeof(arr) / sizeof(arr[0]);quickSort(arr, 0, n - 1);printf("排序后的数组: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;
}

四、快速排序的时间复杂度和空间复杂度

1. 时间复杂度

  • 平均情况:快速排序在平均情况下的时间复杂度为 。这是因为每次划分操作大致能将数组分成两部分,需要递归地对两部分进行排序,而递归的深度大约为 (以 2 为底),每次划分操作需要遍历数组中的大约  个元素,所以总的时间复杂度为 。
  • 最坏情况:当选择的基准元素总是数组中的最大或最小元素时,每次划分操作只能将数组分成一个元素和其余元素两部分,这样就需要进行  次划分操作,每次划分操作需要遍历数组中的  个元素,此时时间复杂度为 。不过,通过合理选择基准元素(如随机选择基准元素等方法)可以尽量避免这种最坏情况的发生。
2. 空间复杂度

快速排序的空间复杂度取决于递归调用的深度。在平均情况下,递归调用的深度为 ,所以空间复杂度为 。在最坏情况下,递归调用的深度为 ,此时空间复杂度为 。

五、快速排序的特点和应用场景

1. 特点

  • 快速排序是一种原地排序算法,它不需要额外的存储空间来存储中间结果(除了递归调用栈所占用的空间)。
  • 它的平均性能非常好,通常比冒泡排序、插入排序等简单排序算法快得多。
2. 应用场景

  • 快速排序适用于对大规模数据进行排序的场景,尤其是当数据分布比较随机时,能够充分发挥其高效的排序性能。
  • 在很多编程语言的标准库中,快速排序常常被用作默认的排序算法或者是排序算法的重要组成部分。

快速排序通过巧妙的划分操作和递归调用,实现了高效的排序功能,但在实际应用中也需要注意避免最坏情况的发生,以确保其高效性。

相关文章:

快速排序算法讲解(c基础)

一、快速排序的基本原理 快速排序是一种基于分治策略的高效排序算法。它的基本思想是&#xff1a; 选择一个基准元素&#xff08;pivot&#xff09;&#xff0c;通过一趟排序将待排序序列分割成两部分&#xff0c;其中一部分的所有元素都比基准元素小&#xff0c;另一部分的所有…...

数据结构--二叉树的创建和遍历

目录 引入 定义 性质 二叉树的创建 迭代法 注意事项&#xff1a; 递归法 注意事项&#xff1a; 二叉树的遍历 深度优先 广度优先 先序遍历&#xff08;前序遍历&#xff09; 中序遍历 后序遍历 层序遍历 查找树结构中是否存在某数值 方法一&#xff1a; 方法…...

2024143读书笔记|《遇见》——立在城市的飞尘里,我们是一列忧愁而又快乐的树

2024143读书笔记|《遇见》——立在城市的飞尘里&#xff0c;我们是一列忧愁而又快乐的树 第1章 年年岁岁岁岁年年第2章 遇见第3章 有个叫“时间”的家伙走过第4章 初雪第6章 回首风烟 《华语散文温柔的一支笔&#xff1a;张晓风作品集&#xff08;共5册&#xff09;》作者张晓风…...

计算机毕业设计Python+卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

leetcode hot100【LeetCode 48.旋转图像】java实现

LeetCode 48.旋转图像 题目描述 给定一个 n x n 的二维矩阵 matrix&#xff0c;表示一个图像。请你将该图像顺时针旋转 90 度。 说明&#xff1a; 你必须在 原地 修改输入的二维矩阵。你可以假设矩阵的所有元素将会是整数。 示例 1: 输入: [[1, 2, 3],[4, 5, 6],[7, 8, …...

力扣1382:将二叉搜索树便平衡

给你一棵二叉搜索树&#xff0c;请你返回一棵 平衡后 的二叉搜索树&#xff0c;新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法&#xff0c;请你返回任意一种。 如果一棵二叉搜索树中&#xff0c;每个节点的两棵子树高度差不超过 1 &#xff0c;我们就称这棵二…...

ElasticSearch学习篇19_《检索技术核心20讲》搜推广系统设计思想

目录 主要是包含搜推广系统的基本模块简单介绍&#xff0c;另有一些流程、设计思想的分析。 搜索引擎 基本模块检索流程 查询分析查询纠错 广告引擎 基于标签倒排索引召回基于向量ANN检索召回打分机制&#xff1a;非精确打分精准深度学习模型打分索引精简&#xff1a;必要的…...

实战ansible-playbook:Ansible Vault加密敏感数据(三)

在实际生产环境中,使用 Ansible Vault 来加密敏感数据是一种常见的做法。以下是一个详细的步骤和实际生产环境的使用案例,展示如何使用 Ansible Vault 来加密和管理敏感数据。 1. 安装 Ansible 确保你已经安装了 Ansible。如果还没有安装,可以使用以下命令进行安装: # 在…...

Python 视频合并工具

Python 视频合并工具 1.简介&#xff1a; 这是一个使用 moviepy 和 tkinter 创建的简单图形用户界面&#xff08;GUI&#xff09;应用程序&#xff0c;用于合并两个视频文件&#xff0c;并在两个视频之间添加淡入淡出过渡效果。程序的功能是&#xff1a; 选择两个视频&#…...

JavaScript实用工具lodash库

Lodash中文文档: Lodash 简介 | Lodash中文文档 | Lodash中文网 Lodash是一个功能强大、易于使用的JavaScript实用工具库&#xff0c;它提供了丰富的函数和工具&#xff0c;能够方便地处理集合、字符串、数值、函数等多种数据类型。通过使用Lodash&#xff0c;开发者可以大幅…...

mapstruct DTO转换使用

定义一个基础接口 package com.example.mapstruct;import org.mapstruct.Named;import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Date; import java.util.List;/*** Author zmn Dat…...

Linux(Centos7)---安装nginx(很简单)

安装 sudo yum install nginx -y开机启动与开启服务 sudo systemctl enable nginx sudo systemctl start nginx...

【接口调试】OpenAI ChatGPT API

【接口调试】AbortController 发出请求finish_reason 参数细节 – Openai ChatGPT 文档 发出请求 可以将以下命令粘贴到终端中以运行第一个API请求。 请确保用您的秘密API密钥替换$OPENAI_API_KEY。 curl https://api.openai.com/v1/chat/completions \-H "Content-Ty…...

云轴科技ZStack助力 “上科大智慧校园信创云平台”入选上海市2024年优秀信创解决方案

近日&#xff0c;为激发创新活⼒&#xff0c;促进信创⾏业⾼质量发展&#xff0c;由上海市经济信息化委会同上海市委网信办、上海市密码管理局、上海市国资委等主办的“2024年上海市优秀信创解决方案”征集遴选活动圆满落幕。云轴科技ZStack支持的“上科大智慧校园信创云平台”…...

CPU性能优化-CPU特性

现代CPU持续的添加新特性&#xff0c;使用这些特性可以大大简化找到底层问题的方法。 1 自顶向下微架构分析TMA&#xff0c;是一种识别应用程序低效使用CPU微架构的强大技术&#xff0c;识别负载的瓶颈&#xff0c;定位出现问题的代码具体位置&#xff0c;封装了CPU微架构中复杂…...

Idea使用Maven连接MySQL数据库

1.首先创建Maven文件 2.在pom.xml里添加代码&#xff0c;配置连接MySQL数据库所需要的配置文件。 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version&…...

《深入浅出HTTPS》读书笔记(13):块密码算法之迭代模式(续)

CTR模式 每次迭代运算的时候要生成一个密钥流&#xff08;keystream&#xff09;。 各个密钥流之间是有关系的&#xff0c;最简单的方式就是密钥流不断递增&#xff0c;所以才叫作计数器模式。 ◎在处理迭代之前&#xff0c;先生成每个密钥流&#xff0c;有n个数据块&#xff0…...

使用Cmake导入OpenCV库的大坑记录

CMakeLists.txt cmake_minimum_required(VERSION 3.20)set(OpenCV_DIR D:/Package/opencv4/opencv/mingw-build/install) #这里根据自己OpenCV位置设定find_package(OpenCV REQUIRED)project(PROJ1 CXX)add_executable(PROJ1 main.cpp)target_include_directories(PROJ1 PR…...

UE5 打包报错 Unknown structure 的解决方法

在虚幻引擎5.5 打包报错如下&#xff1a; UATHelper: 打包 (Windows): LogInit: Display: LogProperty: Error: FStructProperty::Serialize Loading: Property ‘StructProperty /Game/Components/HitReactionComponent/Blueprints/BI_ReactionInterface.BI_ReactionInterface…...

MySQL之单行函数

目录 1. 函数的理解 单行函数 2. 数值函数 2.1 基本函数 2.2 角度与弧度互换函数 2.3 三角函数 2.4 指数与对数 2.5 进制间的转换 3. 字符串函数 4. 日期和时间函数 4.1 获取日期、时间 4.2 日期与时间戳的转换​编辑 4.3 获取月份、星期、星期数、天数等函数 4.4 …...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

简约商务通用宣传年终总结12套PPT模版分享

IOS风格企业宣传PPT模版&#xff0c;年终工作总结PPT模版&#xff0c;简约精致扁平化商务通用动画PPT模版&#xff0c;素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...