C#数据结构与算法4-C# 快速排序

news/2025/3/17 16:55:08/文章来源:https://www.cnblogs.com/firespeed/p/18503556

一 快速排序

快速排序由于排序效率综合来说你几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

二 快速排序详细步骤

以一个数组作为示例,取区间第一个数为基准数。

初始时,i = 0; j = 9; X = a[i] = 72
由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。
从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j–;
数组变为:

i = 3; j = 7; X=72
再重复上面的步骤,先从后向前找,再从前向后找。
从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++
从i开始向后找,当i=5时,由于i==j退出。
此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。
数组变为:

 

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

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

相关文章

C#数据结构与算法1-C# 线性表

一 什么是线性表 线性表是最简单、最基本、最常用的数据结构。线性表是线性结构的抽象(Abstract),线性结构的特点是结构中的数据元素之间存在一对一的线性关系。这种一对一的关系指的是数据元素之间的位置关系,即:( 1)除第一个位置的数据元素外,其它数据元素位置的前面都…

C#数据结构与算法2-C# 栈和队列

一 栈和队列 栈和队列是非常重要的两种数据结构,在软件设计中应用很多。栈和队列也是线性结构,线性表、栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制。栈的操作只能在表的一端进行,队列的插入…

C# 托盘通知

一 托盘通知 NotifyIcon托盘通知:程序可以在通知区创建一个通知图标。一般地,可以提示一个气泡通知,右键菜单支持。准备:需要一个图标(*.ico),用于显示在通知区。如果没有ico格式,可以将png图片转成ico。 演示:在项目中添加托盘通知。① 设置文本Text;② 选择图标Icon; …

学习强化学习有哪些工具

强化学习是一种动态的学习方法,目前有许多工具可以帮助研究者和开发者入门和深入学习。主要工具包括:1、OpenAI Gym:一个用于开发和比较强化学习算法的工具包;2、TensorFlow Agents:一个基于TensorFlow的强化学习库;3、Stable Baselines:一个高质量的强化学习库。其中,…

在C语言中如何处理大型项目的模块化

### 在C语言中如何处理大型项目的模块化 在处理大型项目的模块化时,C语言中的关键策略包括使用函数库、分离编译、使用条件编译指令、以及采用模块化设计原则。其中,使用函数库是最直接有效的方法之一,允许开发者重用代码、减少重复工作,并保持代码的整洁和可管理性。 详细…

基类指针、虚纯虚函数、多态性、虚析构

多态 基类指针 // 父类指针可以 new 一个子类对象 Human *pman = new Man(); Human *pwman = new Wonan();抛出问题:父类指针没有办法调用子类的成员函数,那么你为什么还让父类指针 new 一个子类对象呢? 下面与虚函数搭配 虚函数(动态绑定) 我们只定义一个对象指针,就能…

SATA和NVMe SSD在速度上有多大差异

SATA和NVMe SSD在速度上的差异主要体现在:一、传输接口和带宽能力差异;二、读写速度的差异;三、应用场景和效率的差异;四、价格和市场趋势的差异;五、未来发展的差异。实际上,NVMe SSD在速度上远超SATA SSD,特别适合需要高速数据处理的应用场景,如高端游戏、视频编辑和…

Serverless技术栈推荐

# Serverless技术栈推荐 在探讨Serverless技术栈推荐时,我们首先要明确Serverless的核心优势:无需管理服务器、按需自动扩展、成本效益高、开发效率提高。其中,无需管理服务器是Serverless技术的标志性特征,它允许开发者专注于代码和业务逻辑的实现,而无需担心底层基础设施…

Java面试真题之中级进阶(线程,进程,序列化,IO流,NIO)

前言 本来想着给自己放松一下,刷刷博客,慕然回首,线程、程序、进程?Java 序列化?Java 中 IO 流? Java IO与 NIO的区别(补充)?似乎有点模糊了,那就大概看一下Java基础面试题吧。好记性不如烂键盘 *** 12万字的java面试题整理 *** 简述线程、程序、进程的基本概念。以及…

JUC包下的类

1.原子操作类(Atomic) 在Java运算的多线程环境下进行运算若没有进行额外的同步操作,就是线程不安全的多线程并发共享必然会遇到问题所以可以用原子类解决 (1)AtomicInteger 提供了一个原子性的整数变量,可以进行原子性的加减操作。 (2)AtomicLong 提供了一个原子性的长整型…

一般的Java项目需要JVM调优吗_1

在大多数情况下,Java项目不一定需要进行JVM调优。当项目运行稳定、系统资源没有过分消耗时,调优可能是不必要的工作,并且JVM的现代垃圾收集器已被设计得足够智能,适用于大多数场景。然而,在处理大型应用程序、高并发系统,或者面临复杂的性能要求时,JVM调优则成为确保性能…