hnust 1815: 算法10-6~10-8:快速排序

hnust 1815: 算法10-6~10-8:快速排序

题目描述
快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序的记录分割成两个独立的部分,其中一部分记录的关键字均比另一部分的关键字小,在分成两个部分之后则可以分别对这两个部分继续进行排序,从而使整个序列有序。
快速排序的算法可以描述如下:
在这里插入图片描述

在本题中,读入一串整数,将其使用以上描述的快速排序的方法从小到大排序,并输出。

输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
样例输入 Copy
10
2 8 4 6 1 10 7 3 5 9
样例输出 Copy
1 2 3 4 5 6 7 8 9 10
提示
在本题中,需要按照题目描述中的算法完成快速排序的算法。
快速排序是一种十分常用的排序算法,其平均时间复杂度为O(knlnn),其中n为待排序序列中记录的个数,k为常数。大量的实际应用证明,在所有同数量级的此类排序算法中,快速排序的常数因子k是最小的,因此,就平均时间而言,快速排序是目前被认为最好的一种内部排序方法。
而在C语言的常用编译器中,qsort函数是一个非常常用的快速排序函数。

解题过程

快速排序是一种高效的排序算法,使用分治法(Divide and Conquer)策略来把一个序列分为较小的两个子序列,然后递归地排序两个子序列。

题干代码解析
图片中提供的代码是快速排序算法(Quick Sort)的实现,它由两个主要部分组成:分区函数 Partition 和快速排序函数 QSort。以下是对代码的详细解析:

Partition 函数:

  • 函数作用:对顺序表的一个子序列进行分区操作,使枢轴元素(pivot)最终位于它最终排序的位置,并使所有比它小的元素位于它左边,所有比它大的元素位于它右边。
  • 参数:
    • SqList &L:引用传递的顺序表。
    • int low:子序列的起始索引。
    • int high:子序列的结束索引。
  • 过程:
    • 选择 L.r[low] 作为枢轴记录 pivotkey
    • 使用两个指针 lowhigh,从两端交替向中间扫描,直到 lowhigh 相遇。
    • L.r[high].key 小于或等于 pivotkey 时,将 high 指针向左移动。
    • L.r[low].key 大于 pivotkey 时,将 low 指针向右移动,并交换 L.r[low]L.r[high]
    • lowhigh 相遇时,将枢轴记录移动到它最终的位置 L.r[low]
    • 返回枢轴记录的位置。

QSort 函数:

  • 函数作用:递归地对顺序表的子序列进行快速排序。
  • 参数:
    • SqList &L:引用传递的顺序表。
    • int low:子序列的起始索引。
    • int high:子序列的结束索引。
  • 过程:
    • 如果 low 小于 high,说明子序列长度大于1,需要排序。
    • 调用 Partition 函数对子序列进行分区,得到枢轴位置 pivotloc
    • 对枢轴左边的子序列 L.r[low...pivotloc-1] 递归调用 QSort 进行排序。
    • 对枢轴右边的子序列 L.r[pivotloc+1...high] 递归调用 QSort 进行排序。

QuickSort 函数:

  • 函数作用:快速排序算法的入口函数,对整个顺序表进行排序。
  • 参数:
    • SqList &L:引用传递的顺序表。
  • 过程:
    • 调用 QSort 函数,传入顺序表 L,以及起始索引1和结束索引 L.length

代码逻辑分析:

  • 快速排序是一种分治算法,它通过递归地将数据分为较小的子问题来解决。
  • 算法的关键在于分区操作,它通过选取一个枢轴元素,将数据分为两部分,使得左边的所有元素都不大于枢轴,右边的所有元素都不小于枢轴。
  • 通过递归地对子序列进行快速排序,最终达到整个序列有序的目的。

注意事项:

  • 快速排序的性能在最坏情况下是 O(n^2),但平均情况下是 O(n log n),这取决于枢轴的选择。
  • 快速排序是不稳定的排序算法,因为相同元素的顺序可能会在分区过程中改变。
  • 快速排序通常需要随机化处理来避免最坏情况的发生,特别是在输入数据已经有序或接近有序的情况下。



以下是对小编的高中模板递归方法快速排序的详细讲解

  1. 函数定义

    • quick_sort(int q[], int l, int r):这是快速排序的递归函数,接收一个整数数组 q 和两个整数 lr 作为参数,分别表示要排序的数组部分的起始和结束索引。
  2. 基本情况

    • 如果 l 大于等于 r,则表示当前要排序的数组部分已经是一个元素或为空,不需要排序,直接返回。
  3. 选择基准元素

    • 使用 (l + r >> 1) 计算中间位置的索引,并将该位置的元素 q[l + r >> 1] 作为基准元素 x。这里使用了位运算符 >> 1 来实现整数除以2。
  4. 初始化指针

    • i 初始化为 l - 1j 初始化为 r + 1,这两个指针用于从数组的两端开始遍历。
  5. 分区操作

    • 使用两个 while 循环进行分区:
      • 第一个 while 循环中,i 从左向右遍历,直到找到第一个不小于 x 的元素。
      • 第二个 while 循环中,j 从右向左遍历,直到找到第一个不大于 x 的元素。
    • i 小于 j 时,使用 swap 函数交换 q[i]q[j],将较大的元素移动到数组右侧,较小的元素移动到左侧。
  6. 递归排序

    • 当完成一次分区操作后,对基准元素左边和右边的子数组分别进行快速排序。
  7. 函数调用

    • quick_sort(q, l, j) 对左侧子数组进行排序。
    • quick_sort(q, j + 1, r) 对右侧子数组进行排序。
  8. swap 函数

    • 代码中没有给出 swap 函数的实现,但它应该是一个交换两个整数的函数。
  9. 算法性能

    • 快速排序的平均时间复杂度为 O(n log n),在大多数情况下表现良好。但在最坏情况下(例如,数组已经排序或所有元素相等),时间复杂度会退化为 O(n^2)。
  10. 稳定性

    • 快速排序是不稳定的排序算法,因为相同的元素可能在分区过程中改变它们原来的顺序。

快速排序是一种非常实用的排序算法,由于其高效性,它在实际应用中非常广泛。然而,对于大型数据集或需要稳定性的场景,可能需要考虑其他排序算法,如归并排序。


AC代码

这里小编手懒了,就直接用了高中背过的算法模板,上面有讲解

#include <iostream>
using namespace std;const int N = 1e6 + 10;
int n,q[N];void quick_sort(int q[], int l, int r)
{if(l>=r) return;int x=q[l+r>>1], i=l-1, j=r+1;while(i<j){do i++; while(q[i]<x);do j--; while(q[j]>x);if(i<j) swap(q[i],q[j]);}quick_sort(q,l,j), quick_sort(q,j+1,r);
}int main()
{scanf("%d", &n);for(int i=0; i<n; i++)scanf("%d", &q[i]);quick_sort(q,0,n-1);for(int i=0; i<n; i++)printf("%d ", q[i]);return 0;
}

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

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

相关文章

【人工智能】--强化学习(2.0)

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;强化学习与有监督学习的区别 &#x1f348;数据特点 &#x1f348;学习目标 &#x1f348;反馈机制 &#x1f348;策略…

打赢网络免疫升级战!看聚铭铭察高级威胁检测系统如何重塑网络安全防线

在信息洪流的今天&#xff0c;企业如航行于暗礁密布的数字海洋&#xff0c;面对的不仅仅是已知的病毒与漏洞&#xff0c;更有高级威胁这股暗流&#xff0c;悄无声息地侵蚀着网络的肌理。常规的安全措施&#xff0c;犹如常规体检&#xff0c;虽能捕捉表面的异常&#xff0c;却难…

【论文速读】|FuzzAug:探索模糊测试作为神经网络测试生成的数据增强

本次分享论文&#xff1a;FuzzAug: Exploring Fuzzing as Data Augmentation for Neural Test Generation 基本信息 原文作者&#xff1a;Yifeng He, Jicheng Wang, Yuyang Rong, Hao Chen 作者单位&#xff1a;University of California, Davis 关键词&#xff1a;软件测试…

使用随机生成的随机数过程中,保存数据到数组中 出现很多null

如果 randomId 是一个较大的数字&#xff0c;那么会在 temp 数组中留下很多空位。可能会导致很多 null 值。将 temp 从数组改为对象&#xff0c;以避免稀疏数组的问题。 稀疏数组&#xff1a;当一个数组中大部分元素为0&#xff0c;或者为同一值&#xff08;也就是说可以不是0…

【鸿蒙学习笔记】Image迭代完备

Image Image($r(app.media.zhibo)).width(96) // 图片宽度.height(96) // 图片高度.borderRadius(12) // 图片圆曲度.objectFit(ImageFit.Fill) // 不明objectFit Column({ space: 20 }) {Row() {Image($r(app.media.startIcon)).width(66).height(66).borderRadius(12)}.bac…

结合现货黄金mt4平台 谈谈止损的使用

现在我们做现货黄金交易都可以通过MT4平台来实现从入场到出场的全程操作。所以利用这种网上交易平台&#xff0c;我们能更加好地做止损&#xff0c;下面我们就来讨论一下基于现货黄金MT4平台的止损技巧。 要在现货黄金MT4平台中做好止损&#xff0c;首先我们要确定风险的口子是…

160行代码实现代码雨效果

效果 序言 很喜欢黑客帝国里面那种代码雨的效果&#xff0c;为了锻炼自己的特效编写能力就尝试了一下&#xff0c;花了一下午写出来了。有需要的小伙伴拿去参考. 代码 package com.zgh.myapplication;import android.content.Context; import android.graphics.Canvas; impo…

File类常用构造方法及方法详解

File类是对文件或者目录的一系列操作。如文件和目录的创建、检查、删除、路径获取等。现介绍下常用构造方法和方法。 一、构造方法。 File类提供了多个构造方法来创建File对象&#xff0c;以表示文件或目录。 1. File(String pathname) 通过指定文件路径名创建File对象。 参…

Linux命令大全(面试必备)

前两节有说Git命令&#xff0c;反馈还不错&#xff0c;看来大家对这些必备的命令还挺感兴趣哈&#xff0c;这节就罗列一些Linux必须掌握的命令。 干货满满哦&#xff0c;直接发车... 一、常用的基本命令 1、关机开机 关机 shutdown-h now 立刻关机shutdown-h 3 3分钟后…

文件操作及部分文件函数的介绍学习(上)

目录 前言 1.为什么要要使用文件&#xff1f; 2.什么是文件&#xff1f; 2.1程序文件 2.2数据文件 2.3文件名 4.文件的打开和关闭 4.1 流和标准流 4.1.1流 4.1.2标准流 4.2文件指针 4.3文件的打开和关闭 结语 前言 Hello&#xff0c;亲爱的小伙伴们&#xff0c;作…

Dungeonborne卡顿怎么办 快速解决Dungeonborne卡顿问题

随着Dungeonborne游戏剧情的深入&#xff0c;玩家将逐渐解锁更多的地图和副本&#xff0c;每个区域都有其独特的生态和敌人。在探索的过程中&#xff0c;玩家不仅可以获得强大的装备和道具&#xff0c;还能结识到志同道合的伙伴&#xff0c;共同面对更强大的敌人。不过也有玩家…

新加坡很火的slots游戏代投Facebook广告新流量趋势

新加坡很火的slots游戏代投Facebook广告新流量趋势 在新加坡这片充满活力的土地上&#xff0c;Slots游戏以其独特的魅力和吸引力&#xff0c;迅速成为了许多玩家的心头好。而Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;为Slots游戏的推广提供了得天独厚的…

三、数据库系统(考点篇)

1、三级模式一两级映像 内模式&#xff1a;管理如何存储物理的 数据 &#xff0c;对数据的存储方式、优化、存放等。 模式&#xff1a;又称为概念模式&#xff0c; 就是我们通常使用的表这个级别 &#xff0c;根据应用、需求将物理数据划分成一 张张表。 外模式&#xff1a;…

【算法:贪心】:贪心算法介绍+基础题(四个步骤);柠檬水找零(交换论证法)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 前言&#xff1a; 暑假马上就要留校学习算法了&#xff0c;现在先学习一下基本的算法打打基础。本篇要讲的是…

深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手

我们小时候都玩过乐高积木。通过堆砌各种颜色和形状的积木&#xff0c;我们可以构建出城堡、飞机、甚至整个城市。现在&#xff0c;想象一下如果有一个数字世界的乐高&#xff0c;我们可以用这样的“积木”来构建智能程序&#xff0c;这些程序能够阅读、理解和撰写文本&#xf…

基于DMAIC降低气缸体水套芯磕碰伤率

在制造业的激烈竞争中&#xff0c;产品质量的提升一直是企业追求的目标。气缸体作为汽车发动机的核心部件&#xff0c;其生产过程中的质量控制尤为重要。今天&#xff0c;深圳天行健企业管理咨询公司就来分享一下如何运用DMAIC&#xff08;定义、测量、分析、改进、控制&#x…

基于java+springboot+vue实现的电影院购票系统(文末源码+Lw)274

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装电影院购票系统软件来发挥其高效地信息处理的作用&#xf…

光电液位传感器在宠物洗澡机的应用

光电液位传感器在宠物洗澡机中的应用&#xff0c;为洗澡机的智能化管理提供了重要支持和保障。这种先进的传感技术不仅提升了设备的操作便捷性&#xff0c;还大幅度提高了洗澡过程的安全性和效率。 宠物洗澡机作为宠物护理的重要设备&#xff0c;其水位的控制至关重要。光电液…

C语言 do while 循环语句练习 中

练习&#xff1a; 4.编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 // 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 //welcome to china!!! //w ! //we !! //wel !!! //.... //welco…

【图卷积网络】GCN基础原理简单python实现

基础原理讲解 应用路径 卷积网络最经典的就是CNN&#xff0c;其 可以提取图片中的有效信息&#xff0c;而生活中存在大量拓扑结构的数据。图卷积网络主要特点就是在于其输入数据是图结构数据&#xff0c;即 G ( V , E ) G(V,E) G(V,E)&#xff0c;其中V是节点&#xff0c;E是…