排序算法介绍(四)快速排序

0. 简介

        快速排序(Quick Sort)是一种高效的排序算法,采用了分治的思想。它选择一个基准元素,通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比基准元素小,另一部分的所有元素都比基准元素大,然后再对这两部分继续进行排序,以达到整个序列有序。


1. 快速排序的实现

快速排序的基本思想:

  1. 选择一个基准元素(pivot),通常选择序列的第一个元素。
  2. 将序列中所有比基准元素小的元素放在它的左边,所有比基准元素大的元素放在它的右边。这个过程称为“分区”(Partitioning)。
  3. 对基准元素的左边和右边的两个子序列分别进行快速排序。
  4. 递归地进行以上步骤,直到所有子序列的长度为1,即整个序列有序。

快速排序过程演示:

f3c2a91d34cc49e78025834a07ca8b86.gif


2. 快速排序时空间复杂度分析

常见情况下的时间复杂度和空间复杂度分析:

  1. 时间复杂度:

    • 平均情况:快速排序的平均时间复杂度为 O(n log n),其中 n 是待排序数组的长度。这是因为每次分区操作都能将数组分成大致相等的两部分,使得递归的深度为 log n,而每次分区操作的时间复杂度为 O(n)。
    • 最好情况:当输入数组已经有序或者接近有序时,快速排序的时间复杂度可以达到 O(n log n)。这是因为在这种情况下,每次分区操作都能将数组分成大小相等的两部分,使得递归的深度最小。
    • 最坏情况:当输入数组完全逆序或者存在大量重复元素时,快速排序的时间复杂度会退化为 O(n^2)。这是因为在这种情况下,每次分区操作只能将基准元素与一个元素进行交换,导致递归的深度达到最大。
  2. 空间复杂度:

    • 快速排序是一种原地排序算法,它的空间复杂度是 O(log n)。这是因为快速排序使用递归来实现,而递归需要使用栈来保存函数调用的上下文信息。在平均情况下,递归的深度为 log n,所以空间复杂度为 O(log n)。

以上分析是基于常见的快速排序实现方式,实际应用中可能会根据具体情况进行优化,从而改变时间复杂度和空间复杂度的性质。


3. 快速排序C语言代码

C代码实现:

#include <stdio.h>  
  
void swap(int* a, int* b) {  
    int t = *a;  
    *a = *b;  
    *b = t;  
}  
  
int partition(int array[], int low, int high) {  
    int pivot = array[low];    // 基准元素  
    while (low < high) {  
        // 从后往前找到第一个小于基准元素的元素  
        while (low < high && array[high] >= pivot) {  
            high--;  
        }  
        array[low] = array[high];  // 将这个元素放到左边  
  
        // 从前往后找到第一个大于基准元素的元素  
        while (low < high && array[low] <= pivot) {  
            low++;  
        }  
        array[high] = array[low];  // 将这个元素放到右边  
    }  
    array[low] = pivot;  // 基准元素归位  
    return low;  // 返回基准元素的位置  
}  
  
void quickSort(int array[], int low, int high) {  
    if (low < high) {  
        int pi = partition(array, low, high);  // 获取基准元素位置  
        quickSort(array, low, pi - 1);  // 对基准元素左边的子序列进行递归排序  
        quickSort(array, pi + 1, high);  // 对基准元素右边的子序列进行递归排序  
    }  
}  
  
int main() {  
    int data[] = {8, 7, 2, 1, 0, 9, 6};  // 待排序的数组  
    int n = sizeof(data) / sizeof(data[0]);  // 数组长度  
    quickSort(data, 0, n - 1);  // 快速排序  
    printf("Sorted array in ascending order: \n");  
    for (int i = 0; i < n; ++i) {  
        printf("%d ", data[i]);  // 输出排序后的数组  
    }  
    return 0;  
}

代码解释:

  1. swap 函数用于交换两个整数的值。
  2. partition 函数是快速排序的核心部分,它实现了对待排序数组的分割。函数首先选取数组的第一个元素作为基准元素,然后从数组的末尾开始向前寻找第一个小于基准元素的元素,再从数组的开头开始向后寻找第一个大于基准元素的元素,然后交换这两个元素的位置。这个过程会一直重复,直到两个指针相遇。相遇时的位置就是基准元素应该放置的位置。此时,基准元素左边的所有元素都小于它,右边的所有元素都大于它。最后返回基准元素的位置。
  3. quickSort 函数是一个递归函数,它首先调用 partition 函数获取基准元素的位置,然后分别对基准元素的左右两边的子序列进行递归排序。递归的结束条件是子序列的长度小于等于1,也就是子序列已经是有序的。

4. 快速排序代码运行结果

代码运行结果:

59c0a3f0020345b2b87d4744545feca3.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/214400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS Pro微课1000例】0044:深度学习--面部模糊(马赛克)

本文讲解ArcGIS Pro中通过深度学习工具实现人脸面部模糊,起到马赛克的作用。 文章目录 一、效果对比二、工具介绍三、案例实现一、效果对比 原始图片: 深度学习后的模糊照片: 二、工具介绍 本工具为ArcGIS Pro工具箱中的深度学习工具中的:使用深度学习分类像素,如下所示…

彻底解决ModuleNotFoundError: No module named ‘exceptions‘【Bug完美解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结心得项目场景: 根据本文可找到bug原因并彻底解决**ModuleNotFoundError: No module named ‘exceptions‘**Bug 报错: E:\Anconda\python.exe c:\Users\24190\PycharmProjects\pythonProject4py尝试 gong…

Linux4.7、环境变量

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 基本概念 见见环境变量 指令原理 常见环境变量及其测试 环境变量相关指令 环境变量组织方式 通过代码获取环境变量 通过系统变量获取环境变量以及设置环境变量 环境变量的全局属性 基本概念 首先&#xff0c;…

【Vulnhub 靶场】【Momentum: 2】【简单】【20210628】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/momentum-2,702/ 靶场下载&#xff1a;https://download.vulnhub.com/momentum/Momentum2.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年06月28日 文件大小&#xff1a;698 MB 靶场作者&#xff1…

TeXworks 初次使用 debug方法

下载Texlive&#xff0c;打开TeXworks editor 编译排版&#xff0c;可能会报很多错&#xff1a; 1. ! Fatal Package fontspec Error: The fontspec package requires either XeTeX or (fontspec) LuaTeX. (fontspec) (fontspec) …

【数据结构】二叉树遍历的非递归实现

前言&#xff1a; 本文使用栈以非递归的形式遍历整颗二叉树&#xff0c;我是通过数组模拟栈来实现的&#xff0c;如果对用数组模拟栈不太熟悉&#xff0c;你可以直接使用Stack类作为栈实现。 前序(先序)遍历&#xff1a; 要求&#xff1a;二叉树节点的打印顺序为&#xff1a;中…

山西电力市场日前价格预测【2023-12-04】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-04&#xff09;山西电力市场全天平均日前电价为179.48元/MWh。其中&#xff0c;最高日前电价为362.01元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

Leetcode1094. 拼车

Every day a Leetcode 题目来源&#xff1a;1094. 拼车 解法1&#xff1a;差分数组 对于本题&#xff0c;设 a[i] 表示车行驶到位置 i 时车上的人数。我们需要判断是否所有 a[i] 都不超过 capacity。 trips[i] 相当于把 a 中下标从 fromi 到 toi−1 的数都增加 numPassenge…

游戏配置表的导入使用

游戏配置表是游戏策划的标配&#xff0c;如下图&#xff1a; 那么程序怎么把把这张配置表导入使用&#xff1f; 1.首先&#xff0c;利用命令行把Excel格式的文件转化成Json格式&#xff1a; json-excel\json-excel json Tables\ Data\copy Data\CharacterDefine.txt ..\Cli…

Siemens-NXUG二次开发-Java开发环境配置[20231203]

Siemens-NXUG二次开发-Java开发环境配置[20231203] 1.NX/UG Java API官方开发文档2.安装Java83.安装jetbrain idea3.windows系统环境变量配置4.使用idea创建项目5.NXOpen Java代码生效流程6.API体系简述6.代码示例 1.NX/UG Java API官方开发文档 西门子NX/UG Java api开发文档…

一款自动帮你生成UI界面和代码的AI神器

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 只要描述你想要的UI是什么样的&#xff0c;它就能帮你生成&#xff0c;是不是很神奇&#xff1f; v0使用 AI 模型根据简单的文本提示生成用户界面和代码&#xff…

U盘不仅能在电脑上使用,在手机上也可使用,包括安卓和苹果手机,但苹果的较特殊

许多最好的安卓手机都使用USB-C端口在电脑上充电和来回传输文件,但如果你需要给老板发电子邮件的文件放在闪存驱动器或全尺寸SD卡上呢? 幸运的是,使用廉价的适配器电缆,你可以将USB加密狗或读卡器直接连接到手机上。你甚至可以直接使用USB-C闪存驱动器,以实现更轻松的过程…

Java基础之数组拷贝

Arrays.copyOf 详解 copyOf是Arrays类下面的一个方法,用于拷贝各种数组 以整型数组为例&#xff1a;int [ ] copyOf(int [ ]array,int newLength);第一个参数是想要拷贝到数组&#xff0c;第二个参数是新拷贝得到的数组的大小&#xff08;不一定非得和原始数组大小一样&…

深层神经网络(第四周)

这里省略了深层神经网络的前向传播和反向传播&#xff0c;内容和之前相似&#xff0c;不做过多描述。若今后需要&#xff0c;可以再补习。 一、为什么使用深层表示 解决问题时其实并不需要很大的神经网络&#xff0c;但是得有深度&#xff0c;得有比较多的隐藏层。这是为什么…

DBS note7 (end):DB Design

目录 一、前言 二、引言 三、Entity-Relationship Models&#xff08;实体-关系模型&#xff09; 1、关系约束 三、函数依赖和正则化 1、BCNF分解 2、无损分解 3、依赖关系保留分解 一、前言 略读过一遍CS186&#xff0c;对于CS186来说&#xff0c;绝对不止这 7 篇笔记…

SSM项目实战-登录验证成功并路由到首页面,Vue3+Vite+Axios+Element-Plus技术

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/sysUser.js import request from "../util/request.js";export const login (…

分布式锁框架Lock4j简单使用

最近项目中使用到了Lock4j的分布式锁组件&#xff0c;小编今天就带大家学习一下该框架&#xff0c;以及如何在我们项目中进行集成使用。 一、简介 Lock4j是一个分布式锁组件&#xff0c;它提供了多种不同的支持以满足不同性能和环境的需求&#xff1b;它基于Spring AOP&#…

SQL Server数据库数据文件的迁移

SQL Server数据库数据文件的迁移 如何将一台电脑中的SQL Server数据库数据文件迁移到另一台电脑上&#xff1f; 一、首先查看数据库文件保存在电脑中的位置&#xff1b; 如下图所示&#xff1a;右键-》属性-》数据库设置&#xff1b;可以找到数据库文件保存位置&#xff1b; …

【Node.js】Node.js环境下载与安装教程(Windows系统)

前言 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;可以让你使用JavaScript进行服务器端编程。本教程将向你展示如何在Windows系统上下载和安装Node.js环境。 下载 首先&#xff0c;你需要下载Node.js环境。 打开Node.js官方网站&#xff1a;https://no…

Linux系列-1 Linux启动流程——init与systemd进程

背景&#xff1a; 最近对所有项目完成了一个切换&#xff0c;服务管理方式由&#xff1a; init-> systemd。对相关知识进行总结一下。 1.启动流程 服务器的整体启动流程如下图所示&#xff1a; POST&#xff1a; 计算机通电后进行POST( Power-On Self-Test )加电自检&am…