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

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

相关文章

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

利用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.