C#快速排序算法

快速排序实现原理

快速排序(Quick Sort)是一种常用的排序算法,它基于分治的思想,通过将一个无序的序列分割成两个子序列,并递归地对子序列进行排序,最终完成整个序列的排序。

其基本思路如下:

  1. 选择数组中的一个元素作为基准(pivot)。

  2. 将数组中小于等于基准的元素放在基准的左边,将大于基准的元素放在基准的右边。

  3. 对基准左右两边的子数组分别重复步骤1和步骤2,直到子数组的大小为1或0(递归结束)。

具体实现步骤如下:

  1. 首先选择一个基准元素,通常为数组的第一个或最后一个元素。

  2. 设置两个指针,一个指向数组的起始位置(低位),一个指向数组的结束位置(高位)。

  3. 使用两个指针从两个方向同时遍历数组,直到两个指针相遇。

  4. 从低位开始,比较当前元素与基准元素的大小关系:

    • 如果当前元素小于等于基准元素,则向右移动低位指针。

    • 如果当前元素大于基准元素,则向左移动高位指针。

    • 如果低位指针仍然在高位指针的左侧,则交换低位指针和高位指针所指向的元素。

  5. 重复步骤4,直到低位指针与高位指针相遇。

  6. 将基准元素与相遇位置的元素进行交换,确保基准元素位于其最终的排序位置。

  7. 根据基准元素的位置,将数组分为两个子数组,并递归地对这两个子数组进行快速排序。

快速排序图解

图片

递归的快速排序的代码示例

    public class 快速排序算法{public static void Sort(int[] array, int low, int high){if (low < high){//将数组分割为两部分,并返回分割点的索引int pivotIndex = Partition(array, low, high);//递归对分割后的两部分进行排序Sort(array, low, pivotIndex - 1);Sort(array, pivotIndex + 1, high);}}private static int Partition(int[] array, int low, int high){//选择最后一个元素作为基准元素int pivot = array[high];int i = low - 1;for (int j = low; j <= high - 1; j++){//如果当前元素小于等于基准元素,则将它与i+1位置的元素交换if (array[j] <= pivot){i++;Swap(array, i, j);}}//将基准元素放置到正确的位置上Swap(array, i + 1, high);return i + 1; //返回基准元素的索引}private static void Swap(int[] array, int i, int j){int temp = array[i];array[i] = array[j];array[j] = temp;}public static void QuickSortRun(){int[] array = { 2, 3, 5, 38, 19, 15, 26, 27, 36, 44, 47, 46, 50, 48, 4 };Sort(array, 0, array.Length - 1);Console.WriteLine("排序后结果:" + string.Join(", ", array));}}

总结

快速排序是一种高效的排序算法,它的优势在于平均时间复杂度为O(nlogn),在实际应用中通常表现出色。然而,最坏情况下的时间复杂度可能达到O(n^2),但通过合适的优化方法如随机选择基准元素、三数取中法等,可以避免最坏情况的发生,提高性能。递归方式简洁易懂但对于大数据量的排序可能会出现栈溢出的问题,而使用栈模拟递归则可以解决这个问题。

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

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

相关文章

屏幕录制视频编辑软件 Camtasia 2023 mac中文版软件功能

Camtasia 2023 mac是一款功能强大的屏幕录制和视频编辑软件&#xff0c;可以用于制作教育课程、演示文稿、培训视频等。它具有一系列工具和功能&#xff0c;包括屏幕录制、视频编辑、音频编辑、字幕、特效等&#xff0c;使用户可以轻松地创建高质量的视频内容。 Camtasia2023的…

MongoDB索引操作

1、创建索引 语句&#xff1a; db.collection.createIndex(keys, options, commitQuorum) 选项参数名类型描述keys 包含排序字段和排序方式的对象&#xff0c; 值&#xff1a; 1为升序索引 -1为降序索引 options参数控制对象backgroundboolean 可选&#xff0…

计算机基础知识34

进程锁 # 锁在IT界很重要&#xff0c;不但在Python中出现&#xff0c;尤其是数据库中得锁更多&#xff0c;比如&#xff1a;表锁、行锁、 悲观锁、乐观锁、进程锁、互斥锁、递归锁、可重入锁、死锁等 # 保证安全 import time # 导入time&#xff0c;执行顺序乱了 from…

面试题-React(十五):React中的CSS编写方案及推荐

在React开发中&#xff0c;如何组织和编写CSS是一个常见的问题&#xff0c;React官方并没有一种固定的CSS编写方式&#xff0c;所以在目前的React开发中可能存在各种各样不同的编写CSS风格。本文将介绍React中几种常用的CSS编写方案&#xff0c;分析其优缺点&#xff0c;并推荐…

服务CPU异常飙高问题分析和解决

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

如何使用uview中的loadmore上拉加载

普通用法 HTML <view><view><!-- 内容 --></view><u-loadmore :status"status" /> </view> JS&#xff0c;onReachBottom这个是生命周期&#xff0c;和method同级 data() {return {goods:null,status: loadmore,//当前状态p…

1208. 翻硬币

题目&#xff1a; 1208. 翻硬币 - AcWing题库 思路&#xff1a; 1.对于要求从A变化到B的这类题&#xff0c;可以采用开关控制的方法。 2.一次翻转连续两个硬币&#xff0c;求origin变为result 最少需要翻转多少次。我们在origin的两个硬币中间放一个开关&#xff0c;开关变换…

除静电感测型离子风棒在无尘车间中的应用

除静电感测型离子风棒是一种能够检测静电并及时释放离子的离子风棒&#xff0c;在无尘车间中应用非常广泛。以下是除静电感测型离子风棒在无尘车间中的应用&#xff1a; 防止静电干扰&#xff1a;在无尘车间中&#xff0c;静电干扰会影响电子元器件和仪器设备的正常工作&#x…

基于STM32设计的智慧农业管理系统(ESP8266+腾讯云微信小程序)

一、项目介绍 基于STM32设计的智慧农业控制系统(ESP8266+腾讯云微信小程序) 1.1 项目背景 随着人们对食品安全和生态环境的日益重视,智慧农业逐渐成为一个备受关注的领域。智能化管理可以提高农业生产效率,减少资源浪费,改善生态环境。因此,基于物联网技术的智慧农业管理系…

数据结构-堆排序Java实现

目录 一、引言二、算法步骤三、原理演示步骤1: 构建最大堆步骤2: 交换和堆化步骤3: 排序完成 四、代码实战五、结论 一、引言 堆排序是一种利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子结点的键值或…

MySQL学习(八)——锁

文章目录 1. 锁概述2. 全局锁2.1 全局锁的必要性2.2 语法2.3 全局锁的特点 3. 表级锁3.1 表锁3.2 元数据锁3.3 意向锁3.4 自增锁 4. 行级锁4.1 介绍4.2 记录锁4.3 间隙锁4.4 临键锁 1. 锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传…

图像分割数据集的相关操作(二)—— albumentations 数据增强

前言 相比与torchvision 的 transform 库,albumentations 库提供了更丰富的增强操作和更高的性能;albumentations 通过使用 OpenCV 库实现增强操作,它采用了基于 NumPy 数组的处理方式,并通过并行化和内存优化来提高性能。相比之下,torchvision 的 transform 库是基于 Py…

2023亚马逊下半年的旺季选品攻略,黑五网一圣诞爆单机会不再错过

万圣节、黑五、网一和圣诞节是西方重要销售活动&#xff0c;也是跨境电商的一场重要考试&#xff0c;相对于国内的双十一双十二&#xff0c;这些节日的形成更为久远&#xff0c;需求也更加深入人心&#xff01;卖家需要根据市场需求和竞争情况选择细分品类&#xff0c;为更好的…

LabVIEW建立生产者消费者

LabVIEW建立生产者消费者 生产者/消费者设计模式由并行循环组成&#xff0c;这些循环分为两类&#xff1a;生产者循环和消费者循环。生产者循环和消费者循环间的通信可以使用队列或通道连线来实现。 队列 LabVIEW内置的队列操作VI可在函数选板>>数据通信>>队列操…

Atlas 200I DK目标检测与追踪技术记录

数据集 数据集采用MOT系列&#xff0c;MOT是多目标追踪常用数据集&#xff0c;MOT数据集对数据集进行了分帧&#xff0c;如要获得视频&#xff0c;需要先利用opencv里的cv2.VideoWriter模块便利图片文件夹&#xff0c;具体代码如下&#xff1a; import os import cv2img_path…

django cloudflare csrf 403

网站套了cloudflare flare发现登录接口403了&#xff0c;csrf验证失败&#xff0c; debug设置为False 详细报错如下&#xff1a; Reason given for failure: Referer checking failed - https://xxx/login does not match any trusted origins.In general, this can occur w…

Nginx正向代理,反向代理,负载均衡

Nginx正向代理&#xff0c;反向代理&#xff0c;负载均衡 Nginx当中有两种代理方式&#xff1a; 七层代理&#xff08;http协议&#xff09; 四层代理&#xff08;tcp/udp流量转发&#xff09; 七层代理&#xff1a;七层代理&#xff0c;代理的是http的请求和响应 客户端请求…

开源Vue盲盒商城4.0源码/网页盲盒源码/前端uniapp后端thinkphp+安装教程/亲测

源码简介&#xff1a; 开源Vue盲盒商城4.0源码&#xff0c;它是打包小程序app的网页盲盒源码,亲测可用&#xff0c;它是采用vueTP5框架开发开源盲盒网站源码&#xff0c;附带了安装教程。 简单测试过了&#xff0c;可以使用&#xff0c;大家可以自测下。 前端uniapp后端think…

Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]

Elasticsearch Relevance Engine—为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解] 今天要介绍的 Elasticsearch Relevance Engine™ (ESRE™)&#xff0c;提供了多项用于创建高度相关的 AI 搜索应用程序的新功能。ESRE 站在 Elastic 这个搜索领域的巨人…

数据库设计与前端框架

数据库设计与前端框架 学习目标&#xff1a; 理解多租户的数据库设计方案 熟练使用PowerDesigner构建数据库模型理解前端工程的基本架构和执行流程 完成前端工程企业模块开发 多租户SaaS平台的数据库方案 多租户是什么 多租户技术&#xff08;Multi-TenancyTechnology&a…