带你深入浅出新面经:十六、十大排序之快速排序

2024-08-28 03:44

本文主要是介绍带你深入浅出新面经:十六、十大排序之快速排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此为面经第十六谈!关注我,每日带你深入浅出一个新面经。

我们要了解面经要如何“说”

很重要!很重要!很重要!

我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)

码农不易,各位学者学到东西请点赞支持支持

排序算法部分可以记忆简单过程概述。

开始部分:

总:快速排序算法通过选取一个基准值,将数组分为两个子数组,一个包含小于基准值的元素,另一个包含大于基准值的元素,然后递归地对这两个子数组进行同样的操作,直到整个数组变得有序。

分:

最好时间复杂度就是(nlogn)

最差时间复杂度就是(n²)

平均时间复杂度也是(nlogn)

空间复杂度:nlogn

稳定性:不稳定。

#include <iostream>
#include <vector>
#include <algorithm> // 引入algorithm库,用于swap函数using namespace std;// 快速排序的分区函数
int partition(vector<int>& arr, int low, int high) {int pivot = arr[low]; // 选择基准值,这里选择数组第一个元素int i = low; // i作为小于pivot的区域的指示器int j = high + 1; // j作为大于pivot的区域的指示器// 使用循环进行分区操作while (true) {// 从左向右找到第一个大于等于pivot的元素,大于才能跳出循环while (arr[++i] < pivot);// 从右向左找到第一个小于等于pivot的元素,小于才能跳出循环while (arr[--j] > pivot && j > low);// 如果i和j没有相遇,交换它们所指向的元素if (i < j) {swap(arr[i], arr[j]);} else {break; // 如果i和j相遇,跳出循环}}// 将基准值放到正确的位置,即i和j相遇的位置swap(arr[low], arr[j]);return j; // 返回基准值的索引
}// 快速排序的递归函数
void quickSort(vector<int>& arr, int low, int high) {if (low < high) {int pi = partition(arr, low, high); // 调用分区函数,并得到基准索引quickSort(arr, low, pi - 1); // 递归地对基准左边的子数组排序quickSort(arr, pi + 1, high); // 递归地对基准右边的子数组排序}
}// 主函数,用于测试快速排序
int main() {vector<int> arr = {10, 7, 8, 9, 1, 5};cout << "Original array: ";for (int num : arr) cout << num << " ";cout << endl;quickSort(arr, 0, arr.size() - 1); // 调用快速排序函数cout << "Sorted array: ";for (int num : arr) cout << num << " ";cout << endl;return 0;
}

快速排序的过程可以简单概述为以下几个步骤:

  1. 选择基准值(Pivot):通常选择数组的第一个元素或其他某种策略确定的元素作为基准值。

  2. 分区操作:将数组分为两个子区域,左边子区域的所有元素都小于或等于基准值,右边子区域的所有元素都大于或等于基准值。

  3. 递归排序:对基准值左边和右边的子区域递归地应用快速排序,直到每个子区域只有一个元素或为空。

  4. 组合结果:由于子区域是独立排序的,合并它们不会改变元素的顺序,因此不需要额外的合并步骤。

总:排序可视化网站(建议打开看着代码来了解)Comparison Sorting Visualization (usfca.edu)

看着排序过程来理解代码实现会更好。

   学习链接:https://xxetb.xetslk.com/s/3Kif2D

这篇关于带你深入浅出新面经:十六、十大排序之快速排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113633

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import