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

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS代码混淆工具

目录 引言 混淆效果 字符串加密 代码插入 其他混淆选项说明 总结 参考资料 &#x1f512; 这是一篇介绍iOS代码混淆工具的技术博客&#xff0c;旨在帮助开发者提高代码安全性。本工具来自于Github的混淆词库和代码&#xff0c;通过差异化处理和代码合并生成数亿种用于混淆…

【备忘干货】c/c++ (wasm)和js互相调用记录

c/c&#xff08;wasm&#xff09;和js互相调用记录 废话 :)准备工作&#xff1a;安装Emscripten初探&#xff1a;C(wasm)之hello world进一步探究&#xff1a;接口调用1.js调用c&#xff0c;一些基本类型的传递&#xff08;char*&#xff0c;int&#xff0c;float&#xff09;以…

安装Python以及pycharm

Pycharm是编辑器。相当于Word对文字进行编辑。 Python是解释器。讲代码翻译为计算机可以理解的指令。 1、安装Python 官网&#xff1a;Welcome to Python.org 打开的时候有点慢等待一会就好&#xff0c;点击下载&#xff0c;选择Windows版本 等待一会&#xff0c;可以看到如…

docker内容整理

docker内容整理 docker的安装 检查之前是否安装过docker&#xff0c;如果有使用yum remove docker卸载 [rootwoniu ~]# yum remove docker \ > docker-client \ > docker-client-latest \ > docker-common \ > docker-latest \ > docker-latest-logrotate \ &g…

行业分析:轻轨行业发展现状及市场投资前景

轻轨是城市轨道建设的一种重要形式&#xff0c;也是当今世界上发展最为迅猛的轨道交通形式。轻轨的机车重量和载客量要比一般列车小&#xff0c;因此叫做“轻轨”。 城市轻轨具有运量大、速度快、污染小、能耗少、准点运行、安全性高等优点。城市轻轨与地下铁道、城市铁路及其…

ICC2:如何创建多个core区,分别做power plan

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 如下图,core区域(core row)仅需要存在两个地方,右上大的core区,以及ram上下。 这里需要进行两步操作,分别是create site array创建指定位置的core row,上图所示部分,第二步是创建pg region…

深入理解GMP模型

1、GMP模型的设计思想 1&#xff09;、GMP模型 GMP分别代表&#xff1a; G&#xff1a;goroutine&#xff0c;Go协程&#xff0c;是参与调度与执行的最小单位M&#xff1a;machine&#xff0c;系统级线程P&#xff1a;processor&#xff0c;包含了运行goroutine的资源&#…

Centos系列:Centos7下部署nginx(三种方式安装部署,图文结合超详细,适合初学者)

Centos7下部署nginx&#xff08;三种方式安装部署&#xff0c;图文结合超详细&#xff0c;适合初学者&#xff09; Centos7下部署nginx一. ngxin是什么二. nginx的作用正向代理和反向代理的区别 三. 安装部署安装环境1. yum安装配置nginx源启动nginx浏览器访问&#xff0c; IP:…

打印菱形图案C语言

C代码实现&#xff1a; #include <stdio.h> void printDiamond(int n) { int i, j, space n - 1; // 打印上半部分包括中间行 for (i 0; i < n; i) { // 打印空格 for (j 0; j < space; j) printf(" "); // 打印星号 for (j 1; j < 2 *…

Canvas鼠标画线

鼠标按下开始画线,鼠标移动根据鼠标的轨迹去画,鼠标抬起停止画线 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

备忘录怎么传到电脑?备忘录手机电脑互传方法

对于那些记性不好的人来说&#xff0c;手机上的备忘录简直是个不可或缺的好帮手。可是有时候&#xff0c;我们在手机上记录的内容需要在电脑上查看&#xff0c;这时候该怎么办呢&#xff1f; 曾经&#xff0c;我也为备忘录的手机电脑互传问题头疼不已。手机上记录的事项&#…

element UI改写时间线组件为左右分布

2023.12.4今天我学习了如何使用element的时间线组件&#xff0c;效果如&#xff1a; 代码如下&#xff1a;&#xff08;关键代码 v-if"item.send_type"&#xff09;判断左右分布情况。因为如果没有这个判断的话&#xff0c;其实会两边都有显示。可以用一个判断表示0显…

基于ssm的疫苗预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于ssm的疫苗预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

Pytorch深度强化学习1-5:详解蒙特卡洛强化学习原理

目录 0 专栏介绍1 蒙特卡洛强化学习2 策略评估原理3 策略改进原理3.1 同轨蒙特卡洛强化学习3.2 离轨蒙特卡洛强化学习 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手…

4382系列数字荧光示波器

4382系列数字荧光示波器 简述&#xff1a; 4382系列手持式数字荧光示波器具有8个产品型号&#xff0c;带宽200MHz、350MHz、500MHz、1GHz&#xff0c;最高采样率5GSa/s&#xff0c;最大存储深度60kpts/CH&#xff0c;最快波形捕获率10万个波形/秒&#xff0c;独创的Any Acquire…

专业课145+总分440+东南大学920考研专业基础综合信号与系统数字电路经验分享

个人情况简介 今年考研440&#xff0c;专业课145&#xff0c;数一140&#xff0c;期间一年努力辛苦付出&#xff0c;就不多表了&#xff0c;考研之路虽然艰难&#xff0c;付出很多&#xff0c;当收获的时候&#xff0c;都是值得&#xff0c;考研还是非常公平&#xff0c;希望大…

SpringBoot错误处理机制解析

SpringBoot错误处理----源码解析 文章目录 1、默认机制2、使用ExceptionHandler标识一个方法&#xff0c;处理用Controller标注的该类发生的指定错误1&#xff09;.局部错误处理部分源码2&#xff09;.测试 3、 创建一个全局错误处理类集中处理错误&#xff0c;使用Controller…

基于java技术的电子商务支撑平台

摘 要 随着网络技术的发展&#xff0c;Internet变成了一种处理日常事务的交互式的环境。互联网上开展各种服务已经成为许多企业和部门的急切需求。Web的普遍使用从根本上改变了人们的生活方式、工作方式&#xff0c;也改变了企业的经营方式和服务方式。人们可以足不出户办理各…

财务管理在IT服务管理中的重要作用

官方网站 www.itilzj.com 文档资料: wenku.itilzj.com 财务管理作为一种管理组织财务资源的方法&#xff0c;在IT服务领域扮演着关键的角色。其涵盖的范围涉及预算编制、成本控制、投资决策、财务报告和绩效评估等多个方面&#xff0c;直接关系到IT服务的财务健康和整体运作。…

Csharp(C#)无标题栏窗体拖动代码

C#&#xff08;C Sharp&#xff09;是一种现代、通用的编程语言&#xff0c;由微软公司在2000年推出。C#是一种对象导向的编程语言&#xff0c;它兼具C语言的高效性和Visual Basic语言的易学性。C#主要应用于Windows桌面应用程序、Windows服务、Web应用程序、游戏开发等领域。C…